aboutsummaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2021-07-24 16:59:58 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2021-07-24 16:59:58 +0800
commit77f0e689f84a601f5da4aaf2308bccf74a531346 (patch)
tree8154832f6c4ac0d071a771657c4a67c6a024f398 /data
downloadbktmc-skyblock-77f0e689f84a601f5da4aaf2308bccf74a531346.tar.xz
Initial public release (minecraft 1.17.1).
Diffstat (limited to 'data')
-rw-r--r--data/bktsb/functions/booklistener.mcfunction36
-rw-r--r--data/bktsb/functions/init.mcfunction19
-rw-r--r--data/bktsb/functions/rng.mcfunction7
-rw-r--r--data/bktsb/functions/starterisland.mcfunction3
-rw-r--r--data/bktsb/functions/structgen/gen_amethyst.mcfunction1
-rw-r--r--data/bktsb/functions/structgen/gen_bastion_east.mcfunction25
-rw-r--r--data/bktsb/functions/structgen/gen_bastion_north.mcfunction25
-rw-r--r--data/bktsb/functions/structgen/gen_bastion_south.mcfunction25
-rw-r--r--data/bktsb/functions/structgen/gen_bastion_west.mcfunction25
-rw-r--r--data/bktsb/functions/structgen/gen_dungeon.mcfunction3
-rw-r--r--data/bktsb/functions/structgen/gen_endship_east.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_endship_north.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_endship_south.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_endship_west.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_fortressbalcony_east.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_fortressbalcony_north.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_fortressbalcony_south.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/gen_fortressbalcony_west.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/helpers/amethyst/cast_ray.mcfunction13
-rw-r--r--data/bktsb/functions/structgen/helpers/amethyst/generate.mcfunction20
-rw-r--r--data/bktsb/functions/structgen/helpers/amethyst/loop.mcfunction3
-rw-r--r--data/bktsb/functions/structgen/helpers/amethyst/ray_tick.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/helpers/dungeon/loot.mcfunction22
-rw-r--r--data/bktsb/functions/structgen/helpers/dungeon/room.mcfunction4
-rw-r--r--data/bktsb/functions/structgen/helpers/dungeon/room_callback.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/dungeon/spawner.mcfunction6
-rw-r--r--data/bktsb/functions/structgen/helpers/gen_bastion_helper.mcfunction29
-rw-r--r--data/bktsb/functions/structgen/helpers/gen_end_ship_east_helper.mcfunction5
-rw-r--r--data/bktsb/functions/structgen/helpers/gen_end_ship_north_helper.mcfunction5
-rw-r--r--data/bktsb/functions/structgen/helpers/gen_end_ship_south_helper.mcfunction5
-rw-r--r--data/bktsb/functions/structgen/helpers/gen_end_ship_west_helper.mcfunction5
-rw-r--r--data/bktsb/functions/structgen/helpers/gen_generic_helper.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_bastion_common_loot_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_bastion_treasure_loot_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_elytra_east_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_elytra_north_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_elytra_south_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_elytra_west_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/place_endship_loot_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/structgen/helpers/summon_shulker_and_vanish.mcfunction2
-rw-r--r--data/bktsb/functions/summontrader.mcfunction6
-rw-r--r--data/bktsb/functions/tradecycle.mcfunction7
-rw-r--r--data/bktsb/functions/tradertrades.mcfunction55
-rw-r--r--data/bktsb/predicates/dummy1.json7
-rw-r--r--data/bktsb/predicates/dummy2.json7
-rw-r--r--data/bktsb/predicates/dummy3.json7
-rw-r--r--data/bktsb/predicates/dummy4.json7
-rw-r--r--data/bktsb/predicates/dummy_amethyst.json7
-rw-r--r--data/bktsb/predicates/dummy_dungeon.json7
-rw-r--r--data/bktsb/recipes/braincoralblock.json16
-rw-r--r--data/bktsb/recipes/bubblecoralblock.json16
-rw-r--r--data/bktsb/recipes/coalore.json21
-rw-r--r--data/bktsb/recipes/copperore.json21
-rw-r--r--data/bktsb/recipes/deepslatecoalore.json21
-rw-r--r--data/bktsb/recipes/deepslatecopperore.json21
-rw-r--r--data/bktsb/recipes/deepslatediamondore.json21
-rw-r--r--data/bktsb/recipes/deepslateemeraldore.json21
-rw-r--r--data/bktsb/recipes/deepslategoldore.json21
-rw-r--r--data/bktsb/recipes/deepslateironore.json21
-rw-r--r--data/bktsb/recipes/deepslatelapisore.json21
-rw-r--r--data/bktsb/recipes/deepslateredstore.json21
-rw-r--r--data/bktsb/recipes/diamondore.json21
-rw-r--r--data/bktsb/recipes/dummy1.json16
-rw-r--r--data/bktsb/recipes/dummy2.json16
-rw-r--r--data/bktsb/recipes/dummy3.json17
-rw-r--r--data/bktsb/recipes/dummy4.json17
-rw-r--r--data/bktsb/recipes/dummy_amethyst.json17
-rw-r--r--data/bktsb/recipes/dummy_dungeon.json18
-rw-r--r--data/bktsb/recipes/egapple.json19
-rw-r--r--data/bktsb/recipes/emeraldore.json21
-rw-r--r--data/bktsb/recipes/endstone.json23
-rw-r--r--data/bktsb/recipes/firecoralblock.json16
-rw-r--r--data/bktsb/recipes/gildedblackst.json20
-rw-r--r--data/bktsb/recipes/goldore.json21
-rw-r--r--data/bktsb/recipes/horncoralblock.json16
-rw-r--r--data/bktsb/recipes/ironore.json21
-rw-r--r--data/bktsb/recipes/lapisore.json21
-rw-r--r--data/bktsb/recipes/nethergoldore.json20
-rw-r--r--data/bktsb/recipes/quartzore.json18
-rw-r--r--data/bktsb/recipes/redsand.json20
-rw-r--r--data/bktsb/recipes/redstore.json21
-rw-r--r--data/bktsb/recipes/soulsoil.json19
-rw-r--r--data/bktsb/recipes/tubecoralblock.json16
-rw-r--r--data/bktsb/structures/dungeon_base.nbtbin0 -> 376 bytes
-rw-r--r--data/bktsb/structures/island.nbtbin0 -> 4794 bytes
-rw-r--r--data/bktsb/structures/nether/bastion1.nbtbin0 -> 2219 bytes
-rw-r--r--data/bktsb/structures/nether/bastion2.nbtbin0 -> 1533 bytes
-rw-r--r--data/bktsb/structures/nether/bastion3.nbtbin0 -> 2461 bytes
-rw-r--r--data/bktsb/structures/nether/bastion4.nbtbin0 -> 11793 bytes
-rw-r--r--data/bktsb/structures/nether/fortress.nbtbin0 -> 1154 bytes
-rw-r--r--data/minecraft/dimension_type/overworld.json17
-rw-r--r--data/minecraft/dimension_type/overworld_caves.json17
-rw-r--r--data/minecraft/loot_tables/chests/end_city_treasure.json345
-rw-r--r--data/minecraft/loot_tables/entities/blaze.json67
-rw-r--r--data/minecraft/loot_tables/entities/creeper.json81
-rw-r--r--data/minecraft/loot_tables/entities/evoker.json45
-rw-r--r--data/minecraft/loot_tables/entities/husk.json54
-rw-r--r--data/minecraft/loot_tables/entities/magma_cube.json50
-rw-r--r--data/minecraft/loot_tables/entities/shulker.json31
-rw-r--r--data/minecraft/loot_tables/entities/witch.json183
-rw-r--r--data/minecraft/loot_tables/entities/zombie.json89
-rw-r--r--data/minecraft/loot_tables/entities/zombified_piglin.json107
-rw-r--r--data/minecraft/tags/functions/load.json5
-rw-r--r--data/minecraft/tags/functions/tick.json7
104 files changed, 2206 insertions, 0 deletions
diff --git a/data/bktsb/functions/booklistener.mcfunction b/data/bktsb/functions/booklistener.mcfunction
new file mode 100644
index 0000000..709f2c6
--- /dev/null
+++ b/data/bktsb/functions/booklistener.mcfunction
@@ -0,0 +1,36 @@
+execute as @a[predicate=bktsb:dummy1,y_rotation=-45..44] at @s run function bktsb:structgen/gen_endship_south
+execute as @a[predicate=bktsb:dummy1,y_rotation=45..134] at @s run function bktsb:structgen/gen_endship_west
+execute as @a[predicate=bktsb:dummy1,y_rotation=135..224] at @s run function bktsb:structgen/gen_endship_north
+execute as @a[predicate=bktsb:dummy1,y_rotation=-135..-46] at @s run function bktsb:structgen/gen_endship_east
+recipe take @a[predicate=bktsb:dummy1] bktsb:dummy1
+
+execute as @a[predicate=bktsb:dummy2,y_rotation=-45..44] at @s run function bktsb:structgen/gen_bastion_south
+execute as @a[predicate=bktsb:dummy2,y_rotation=45..134] at @s run function bktsb:structgen/gen_bastion_west
+execute as @a[predicate=bktsb:dummy2,y_rotation=135..224] at @s run function bktsb:structgen/gen_bastion_north
+execute as @a[predicate=bktsb:dummy2,y_rotation=-135..-46] at @s run function bktsb:structgen/gen_bastion_east
+recipe take @a[predicate=bktsb:dummy2] bktsb:dummy2
+
+execute as @a[predicate=bktsb:dummy3,y_rotation=-45..44] at @s run function bktsb:structgen/gen_fortressbalcony_south
+execute as @a[predicate=bktsb:dummy3,y_rotation=45..134] at @s run function bktsb:structgen/gen_fortressbalcony_west
+execute as @a[predicate=bktsb:dummy3,y_rotation=135..224] at @s run function bktsb:structgen/gen_fortressbalcony_north
+execute as @a[predicate=bktsb:dummy3,y_rotation=-135..-46] at @s run function bktsb:structgen/gen_fortressbalcony_east
+recipe take @a[predicate=bktsb:dummy3] bktsb:dummy3
+
+execute as @a[predicate=bktsb:dummy4,y_rotation=-45..44] at @s run setblock ~ ~ ~1 chest[facing=north]
+execute as @a[predicate=bktsb:dummy4,y_rotation=-45..44] at @s run data modify block ~ ~ ~1 LootTable set value "minecraft:chests/buried_treasure"
+
+execute as @a[predicate=bktsb:dummy4,y_rotation=45..134] at @s run setblock ~-1 ~ ~ chest[facing=east]
+execute as @a[predicate=bktsb:dummy4,y_rotation=45..134] at @s run data modify block ~-1 ~ ~ LootTable set value "minecraft:chests/buried_treasure"
+
+execute as @a[predicate=bktsb:dummy4,y_rotation=135..224] at @s run setblock ~ ~ ~-1 chest[facing=south]
+execute as @a[predicate=bktsb:dummy4,y_rotation=135..224] at @s run data modify block ~ ~ ~-1 LootTable set value "minecraft:chests/buried_treasure"
+
+execute as @a[predicate=bktsb:dummy4,y_rotation=-135..-46] at @s run setblock ~1 ~ ~ chest[facing=west]
+execute as @a[predicate=bktsb:dummy4,y_rotation=-135..-46] at @s run data modify block ~1 ~ ~ LootTable set value "minecraft:chests/buried_treasure"
+recipe take @a[predicate=bktsb:dummy4] bktsb:dummy4
+
+execute as @a[predicate=bktsb:dummy_amethyst] at @s run function bktsb:structgen/gen_amethyst
+recipe take @a[predicate=bktsb:dummy_amethyst] bktsb:dummy_amethyst
+
+execute as @a[predicate=bktsb:dummy_dungeon] at @s run function bktsb:structgen/gen_dungeon
+recipe take @a[predicate=bktsb:dummy_dungeon] bktsb:dummy_dungeon
diff --git a/data/bktsb/functions/init.mcfunction b/data/bktsb/functions/init.mcfunction
new file mode 100644
index 0000000..36dd5e1
--- /dev/null
+++ b/data/bktsb/functions/init.mcfunction
@@ -0,0 +1,19 @@
+scoreboard objectives add srand dummy
+scoreboard objectives add randr dummy
+scoreboard objectives add c dummy
+scoreboard objectives add m dummy
+scoreboard objectives add p dummy
+scoreboard objectives add lim dummy
+scoreboard objectives add genvar dummy
+scoreboard objectives add booktrigger minecraft.used:minecraft.knowledge_book
+scoreboard objectives add firstload dummy
+scoreboard objectives add looper dummy
+scoreboard objectives add loopstep dummy
+scoreboard players set #a c 12345
+scoreboard players set #a m 1103515245
+scoreboard players set #a p 2147483647
+scoreboard players set #a srand 617274873
+
+execute unless score #a firstload matches 1 run scoreboard players set #a firstload 0
+execute if score #a firstload matches 0 run function bktsb:starterisland
+scoreboard players set #a testFirst 1
diff --git a/data/bktsb/functions/rng.mcfunction b/data/bktsb/functions/rng.mcfunction
new file mode 100644
index 0000000..cf10912
--- /dev/null
+++ b/data/bktsb/functions/rng.mcfunction
@@ -0,0 +1,7 @@
+#set lim before using
+scoreboard players operation #a srand *= #a m
+scoreboard players operation #a srand += #a c
+scoreboard players operation #a srand %= #a p
+scoreboard players operation #a randr = #a srand
+scoreboard players operation #a randr %= #a lim
+#result in randr
diff --git a/data/bktsb/functions/starterisland.mcfunction b/data/bktsb/functions/starterisland.mcfunction
new file mode 100644
index 0000000..6b1565b
--- /dev/null
+++ b/data/bktsb/functions/starterisland.mcfunction
@@ -0,0 +1,3 @@
+setworldspawn 0 67 0 -90
+setblock -3 65 -1 minecraft:structure_block{name:"bktsb:island",mode:"LOAD",ignoreEntities:1,rotation:"NONE"} replace
+setblock -3 66 -1 minecraft:redstone_block
diff --git a/data/bktsb/functions/structgen/gen_amethyst.mcfunction b/data/bktsb/functions/structgen/gen_amethyst.mcfunction
new file mode 100644
index 0000000..f733f22
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_amethyst.mcfunction
@@ -0,0 +1 @@
+function bktsb:structgen/helpers/amethyst/generate
diff --git a/data/bktsb/functions/structgen/gen_bastion_east.mcfunction b/data/bktsb/functions/structgen/gen_bastion_east.mcfunction
new file mode 100644
index 0000000..b4266b2
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_bastion_east.mcfunction
@@ -0,0 +1,25 @@
+scoreboard players set #a lim 4
+function bktsb:rng
+scoreboard players operation #a genvar = #a randr
+#for debugging
+#scoreboard players set #a genvar 0
+
+#11 x 4 x 12, w x h x d
+execute if score #a genvar matches 0 run setblock ~13 ~ ~-5 minecraft:structure_block{name:"bktsb:nether/bastion1",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_90"} replace
+execute if score #a genvar matches 0 run setblock ~13 ~12 ~-5 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 0 run setblock ~13 ~1 ~-5 redstone_block
+
+#10 x 3 x 10
+execute if score #a genvar matches 1 run setblock ~11 ~ ~-5 minecraft:structure_block{name:"bktsb:nether/bastion2",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_90"} replace
+execute if score #a genvar matches 1 run setblock ~11 ~12 ~-5 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 1 run setblock ~11 ~1 ~-5 redstone_block
+
+#11 x 5 x 11
+execute if score #a genvar matches 2 run setblock ~12 ~ ~-5 minecraft:structure_block{name:"bktsb:nether/bastion3",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_90"} replace
+execute if score #a genvar matches 2 run setblock ~12 ~12 ~-5 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 2 run setblock ~12 ~1 ~-5 redstone_block
+
+#19 x 10 x 20
+execute if score #a genvar matches 3 run setblock ~21 ~ ~-9 minecraft:structure_block{name:"bktsb:nether/bastion4",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_90"} replace
+execute if score #a genvar matches 3 run setblock ~21 ~12 ~-9 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 3 run setblock ~21 ~1 ~-9 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_bastion_north.mcfunction b/data/bktsb/functions/structgen/gen_bastion_north.mcfunction
new file mode 100644
index 0000000..492ef0c
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_bastion_north.mcfunction
@@ -0,0 +1,25 @@
+scoreboard players set #a lim 4
+function bktsb:rng
+scoreboard players operation #a genvar = #a randr
+#for debugging
+#scoreboard players set #a genvar 0
+
+#11 x 4 x 12, w x h x d
+execute if score #a genvar matches 0 run setblock ~-5 ~ ~-13 minecraft:structure_block{name:"bktsb:nether/bastion1",mode:"LOAD",ignoreEntities:1,rotation:"NONE"} replace
+execute if score #a genvar matches 0 run setblock ~-5 ~12 ~-13 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 0 run setblock ~-5 ~1 ~-13 redstone_block
+
+#10 x 3 x 10
+execute if score #a genvar matches 1 run setblock ~-5 ~ ~-11 minecraft:structure_block{name:"bktsb:nether/bastion2",mode:"LOAD",ignoreEntities:1,rotation:"NONE"} replace
+execute if score #a genvar matches 1 run setblock ~-5 ~12 ~-11 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 1 run setblock ~-5 ~1 ~-11 redstone_block
+
+#11 x 5 x 11
+execute if score #a genvar matches 2 run setblock ~-5 ~ ~-12 minecraft:structure_block{name:"bktsb:nether/bastion3",mode:"LOAD",ignoreEntities:1,rotation:"NONE"} replace
+execute if score #a genvar matches 2 run setblock ~-5 ~12 ~-12 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 2 run setblock ~-5 ~1 ~-12 redstone_block
+
+#19 x 10 x 20
+execute if score #a genvar matches 3 run setblock ~-9 ~ ~-21 minecraft:structure_block{name:"bktsb:nether/bastion4",mode:"LOAD",ignoreEntities:1,rotation:"NONE"} replace
+execute if score #a genvar matches 3 run setblock ~-9 ~12 ~-21 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 3 run setblock ~-9 ~1 ~-21 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_bastion_south.mcfunction b/data/bktsb/functions/structgen/gen_bastion_south.mcfunction
new file mode 100644
index 0000000..d031e21
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_bastion_south.mcfunction
@@ -0,0 +1,25 @@
+scoreboard players set #a lim 4
+function bktsb:rng
+scoreboard players operation #a genvar = #a randr
+#for debugging
+#scoreboard players set #a genvar 0
+
+#11 x 4 x 12, w x h x d
+execute if score #a genvar matches 0 run setblock ~5 ~ ~13 minecraft:structure_block{name:"bktsb:nether/bastion1",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_180"} replace
+execute if score #a genvar matches 0 run setblock ~5 ~12 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 0 run setblock ~5 ~1 ~13 redstone_block
+
+#10 x 3 x 10
+execute if score #a genvar matches 1 run setblock ~5 ~ ~11 minecraft:structure_block{name:"bktsb:nether/bastion2",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_180"} replace
+execute if score #a genvar matches 1 run setblock ~5 ~12 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 1 run setblock ~5 ~1 ~11 redstone_block
+
+#11 x 5 x 11
+execute if score #a genvar matches 2 run setblock ~5 ~ ~12 minecraft:structure_block{name:"bktsb:nether/bastion3",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_180"} replace
+execute if score #a genvar matches 2 run setblock ~5 ~12 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 2 run setblock ~5 ~1 ~12 redstone_block
+
+#19 x 10 x 20
+execute if score #a genvar matches 3 run setblock ~9 ~ ~21 minecraft:structure_block{name:"bktsb:nether/bastion4",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_180"} replace
+execute if score #a genvar matches 3 run setblock ~9 ~12 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 3 run setblock ~9 ~1 ~21 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_bastion_west.mcfunction b/data/bktsb/functions/structgen/gen_bastion_west.mcfunction
new file mode 100644
index 0000000..4ff206f
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_bastion_west.mcfunction
@@ -0,0 +1,25 @@
+scoreboard players set #a lim 4
+function bktsb:rng
+scoreboard players operation #a genvar = #a randr
+#for debugging
+#scoreboard players set #a genvar 0
+
+#11 x 4 x 12, w x h x d
+execute if score #a genvar matches 0 run setblock ~-13 ~ ~5 minecraft:structure_block{name:"bktsb:nether/bastion1",mode:"LOAD",ignoreEntities:1,rotation:"COUNTERCLOCKWISE_90"} replace
+execute if score #a genvar matches 0 run setblock ~-13 ~12 ~5 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 0 run setblock ~-13 ~1 ~5 redstone_block
+
+#10 x 3 x 10
+execute if score #a genvar matches 1 run setblock ~-11 ~ ~5 minecraft:structure_block{name:"bktsb:nether/bastion2",mode:"LOAD",ignoreEntities:1,rotation:"COUNTERCLOCKWISE_90"} replace
+execute if score #a genvar matches 1 run setblock ~-11 ~12 ~5 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 1 run setblock ~-11 ~1 ~5 redstone_block
+
+#11 x 5 x 11
+execute if score #a genvar matches 2 run setblock ~-12 ~ ~5 minecraft:structure_block{name:"bktsb:nether/bastion3",mode:"LOAD",ignoreEntities:1,rotation:"COUNTERCLOCKWISE_90"} replace
+execute if score #a genvar matches 2 run setblock ~-12 ~12 ~5 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 2 run setblock ~-12 ~1 ~5 redstone_block
+
+#19 x 10 x 20
+execute if score #a genvar matches 3 run setblock ~-21 ~ ~9 minecraft:structure_block{name:"bktsb:nether/bastion4",mode:"LOAD",ignoreEntities:1,rotation:"COUNTERCLOCKWISE_90"} replace
+execute if score #a genvar matches 3 run setblock ~-21 ~12 ~9 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_bastion_helper",TrackOutput:0}
+execute if score #a genvar matches 3 run setblock ~-21 ~1 ~9 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_dungeon.mcfunction b/data/bktsb/functions/structgen/gen_dungeon.mcfunction
new file mode 100644
index 0000000..50ef606
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_dungeon.mcfunction
@@ -0,0 +1,3 @@
+function bktsb:structgen/helpers/dungeon/room
+execute positioned ~ ~-1 ~ if block ~ ~ ~ gold_block run function bktsb:structgen/helpers/dungeon/spawner
+function bktsb:structgen/helpers/dungeon/loot
diff --git a/data/bktsb/functions/structgen/gen_endship_east.mcfunction b/data/bktsb/functions/structgen/gen_endship_east.mcfunction
new file mode 100644
index 0000000..0547a36
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_endship_east.mcfunction
@@ -0,0 +1,4 @@
+#13 x 24 x 29, w x h x d
+setblock ~30 ~ ~-6 minecraft:structure_block{name:"end_city/ship",mode:"LOAD",ignoreEntities:0,rotation:"CLOCKWISE_90"} replace
+setblock ~30 ~30 ~-6 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_end_ship_east_helper",TrackOutput:0}
+setblock ~30 ~1 ~-6 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_endship_north.mcfunction b/data/bktsb/functions/structgen/gen_endship_north.mcfunction
new file mode 100644
index 0000000..7cde7f2
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_endship_north.mcfunction
@@ -0,0 +1,4 @@
+#13 x 24 x 29, w x h x d
+setblock ~-6 ~ ~-30 minecraft:structure_block{name:"end_city/ship",mode:"LOAD",ignoreEntities:0,rotation:"NONE"} replace
+setblock ~-6 ~30 ~-30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_end_ship_north_helper",TrackOutput:0}
+setblock ~-6 ~1 ~-30 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_endship_south.mcfunction b/data/bktsb/functions/structgen/gen_endship_south.mcfunction
new file mode 100644
index 0000000..0499ac2
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_endship_south.mcfunction
@@ -0,0 +1,4 @@
+#13 x 24 x 29, w x h x d
+setblock ~6 ~ ~30 minecraft:structure_block{name:"end_city/ship",mode:"LOAD",ignoreEntities:0,rotation:"CLOCKWISE_180"} replace
+setblock ~6 ~30 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_end_ship_south_helper",TrackOutput:0}
+setblock ~6 ~1 ~30 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_endship_west.mcfunction b/data/bktsb/functions/structgen/gen_endship_west.mcfunction
new file mode 100644
index 0000000..b83d94c
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_endship_west.mcfunction
@@ -0,0 +1,4 @@
+#13 x 24 x 29, w x h x d
+setblock ~-30 ~ ~6 minecraft:structure_block{name:"end_city/ship",mode:"LOAD",ignoreEntities:0,rotation:"COUNTERCLOCKWISE_90"} replace
+setblock ~-30 ~30 ~6 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_end_ship_west_helper",TrackOutput:0}
+setblock ~-30 ~1 ~6 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_fortressbalcony_east.mcfunction b/data/bktsb/functions/structgen/gen_fortressbalcony_east.mcfunction
new file mode 100644
index 0000000..489efee
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_fortressbalcony_east.mcfunction
@@ -0,0 +1,4 @@
+# 7 x 5 x 7
+setblock ~8 ~ ~3 minecraft:structure_block{name:"bktsb:nether/fortress",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_180"} replace
+setblock ~8 ~12 ~3 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_generic_helper",TrackOutput:0}
+setblock ~8 ~1 ~3 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_fortressbalcony_north.mcfunction b/data/bktsb/functions/structgen/gen_fortressbalcony_north.mcfunction
new file mode 100644
index 0000000..f9c3028
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_fortressbalcony_north.mcfunction
@@ -0,0 +1,4 @@
+# 7 x 5 x 7
+setblock ~3 ~ ~-8 minecraft:structure_block{name:"bktsb:nether/fortress",mode:"LOAD",ignoreEntities:1,rotation:"CLOCKWISE_90"} replace
+setblock ~3 ~12 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_generic_helper",TrackOutput:0}
+setblock ~3 ~1 ~-8 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_fortressbalcony_south.mcfunction b/data/bktsb/functions/structgen/gen_fortressbalcony_south.mcfunction
new file mode 100644
index 0000000..9418e6f
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_fortressbalcony_south.mcfunction
@@ -0,0 +1,4 @@
+# 7 x 5 x 7
+setblock ~-3 ~ ~8 minecraft:structure_block{name:"bktsb:nether/fortress",mode:"LOAD",ignoreEntities:1,rotation:"COUNTERCLOCKWISE_90"} replace
+setblock ~-3 ~12 ~ minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_generic_helper",TrackOutput:0}
+setblock ~-3 ~1 ~8 redstone_block
diff --git a/data/bktsb/functions/structgen/gen_fortressbalcony_west.mcfunction b/data/bktsb/functions/structgen/gen_fortressbalcony_west.mcfunction
new file mode 100644
index 0000000..e5b791d
--- /dev/null
+++ b/data/bktsb/functions/structgen/gen_fortressbalcony_west.mcfunction
@@ -0,0 +1,4 @@
+# 7 x 5 x 7
+setblock ~-8 ~ ~-3 minecraft:structure_block{name:"bktsb:nether/fortress",mode:"LOAD",ignoreEntities:1,rotation:"NONE"} replace
+setblock ~-8 ~12 ~-3 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/gen_generic_helper",TrackOutput:0}
+setblock ~-8 ~1 ~-3 redstone_block
diff --git a/data/bktsb/functions/structgen/helpers/amethyst/cast_ray.mcfunction b/data/bktsb/functions/structgen/helpers/amethyst/cast_ray.mcfunction
new file mode 100644
index 0000000..74ec2b3
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/amethyst/cast_ray.mcfunction
@@ -0,0 +1,13 @@
+summon armor_stand ~ ~ ~ {Glowing:1,NoGravity:1}
+
+scoreboard players set #a lim 360
+function bktsb:rng
+execute store result entity @e[type=armor_stand,sort=nearest,nbt={Glowing:1b},tag=!ame_rays,limit=1] Rotation[0] float 1.0 run scoreboard players get #a randr
+
+scoreboard players set #a lim 181
+function bktsb:rng
+scoreboard players set #a lim 90
+scoreboard players operation #a randr -= #a lim
+execute store result entity @e[type=armor_stand,sort=nearest,nbt={Glowing:1b},tag=!ame_rays,limit=1] Rotation[1] float 1.0 run scoreboard players get #a randr
+
+tag @e[type=armor_stand,sort=nearest,nbt={Glowing:1b},tag=!ame_rays,limit=1] add ame_rays
diff --git a/data/bktsb/functions/structgen/helpers/amethyst/generate.mcfunction b/data/bktsb/functions/structgen/helpers/amethyst/generate.mcfunction
new file mode 100644
index 0000000..19719a4
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/amethyst/generate.mcfunction
@@ -0,0 +1,20 @@
+scoreboard players set #a genvar 0
+execute if block ~ ~-1 ~ diamond_block run scoreboard players set #a genvar 1
+
+fill ~-11 ~-12 ~-11 ~11 ~11 ~11 air
+kill @e[type=item,distance=..20,nbt={Item:{id:"minecraft:redstone"}}]
+fill ~-11 ~-11 ~-11 ~11 ~11 ~11 redstone_wire
+execute as @e[type=item,distance=..10,nbt={Item:{id:"minecraft:redstone"}}] at @s run setblock ~ ~ ~ smooth_basalt
+execute as @e[type=item,distance=..9,nbt={Item:{id:"minecraft:redstone"}}] at @s run setblock ~ ~ ~ calcite
+execute as @e[type=item,distance=..8,nbt={Item:{id:"minecraft:redstone"}}] at @s run setblock ~ ~ ~ amethyst_block
+execute as @e[type=item,distance=..7,nbt={Item:{id:"minecraft:redstone"}}] at @s run setblock ~ ~ ~ air
+kill @e[type=item,distance=..20,nbt={Item:{id:"minecraft:redstone"}}]
+
+scoreboard players set #a lim 24
+function bktsb:rng
+scoreboard players operation #a looper = #a randr
+scoreboard players set #a lim 16
+scoreboard players operation #a looper += #a lim
+scoreboard players set #a loopstep 1
+
+execute if score #a genvar matches 1.. run setblock ~ ~-1 ~ repeating_command_block{auto:1,Command:"function bktsb:structgen/helpers/amethyst/loop",TrackOutput:0}
diff --git a/data/bktsb/functions/structgen/helpers/amethyst/loop.mcfunction b/data/bktsb/functions/structgen/helpers/amethyst/loop.mcfunction
new file mode 100644
index 0000000..dcd7362
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/amethyst/loop.mcfunction
@@ -0,0 +1,3 @@
+execute if score #a looper matches ..0 run setblock ~ ~ ~ amethyst_block
+execute positioned ~ ~1 ~ if score #a looper matches 1.. run function bktsb:structgen/helpers/amethyst/cast_ray
+execute if score #a looper matches 1.. run scoreboard players operation #a looper -= #a loopstep
diff --git a/data/bktsb/functions/structgen/helpers/amethyst/ray_tick.mcfunction b/data/bktsb/functions/structgen/helpers/amethyst/ray_tick.mcfunction
new file mode 100644
index 0000000..9dca97b
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/amethyst/ray_tick.mcfunction
@@ -0,0 +1,4 @@
+execute as @e[type=armor_stand,tag=ame_rays] at @s run tp @s ^ ^ ^1
+execute as @e[type=armor_stand,tag=ame_rays] at @s if block ~ ~ ~ amethyst_block run setblock ~ ~ ~ budding_amethyst
+execute as @e[type=armor_stand,tag=ame_rays] at @s if block ~ ~ ~ calcite run kill @s
+execute as @e[type=armor_stand,tag=ame_rays] at @s if block ~ ~ ~ smooth_basalt run kill @s
diff --git a/data/bktsb/functions/structgen/helpers/dungeon/loot.mcfunction b/data/bktsb/functions/structgen/helpers/dungeon/loot.mcfunction
new file mode 100644
index 0000000..a7f0f2e
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/dungeon/loot.mcfunction
@@ -0,0 +1,22 @@
+scoreboard players set #a lim 4
+function bktsb:rng
+
+execute if score #a randr matches 0 run setblock ~-3 ~-1 ~-2 chest[facing=east]
+execute if score #a randr matches 0 run data merge block ~-3 ~-1 ~-2 {LootTable:"minecraft:chests/simple_dungeon"}
+execute if score #a randr matches 0 run setblock ~-2 ~-1 ~-3 chest[facing=south]
+execute if score #a randr matches 0 run data merge block ~-2 ~-1 ~-3 {LootTable:"minecraft:chests/abandoned_mineshaft"}
+
+execute if score #a randr matches 1 run setblock ~-3 ~-1 ~2 chest[facing=east]
+execute if score #a randr matches 1 run data merge block ~-3 ~-1 ~2 {LootTable:"minecraft:chests/simple_dungeon"}
+execute if score #a randr matches 1 run setblock ~-2 ~-1 ~3 chest[facing=north]
+execute if score #a randr matches 1 run data merge block ~-2 ~-1 ~3 {LootTable:"minecraft:chests/abandoned_mineshaft"}
+
+execute if score #a randr matches 2 run setblock ~3 ~-1 ~-2 chest[facing=west]
+execute if score #a randr matches 2 run data merge block ~3 ~-1 ~-2 {LootTable:"minecraft:chests/simple_dungeon"}
+execute if score #a randr matches 2 run setblock ~2 ~-1 ~-3 chest[facing=south]
+execute if score #a randr matches 2 run data merge block ~2 ~-1 ~-3 {LootTable:"minecraft:chests/abandoned_mineshaft"}
+
+execute if score #a randr matches 3 run setblock ~3 ~-1 ~2 chest[facing=west]
+execute if score #a randr matches 3 run data merge block ~3 ~-1 ~2 {LootTable:"minecraft:chests/simple_dungeon"}
+execute if score #a randr matches 3 run setblock ~2 ~-1 ~3 chest[facing=north]
+execute if score #a randr matches 3 run data merge block ~2 ~-1 ~3 {LootTable:"minecraft:chests/abandoned_mineshaft"}
diff --git a/data/bktsb/functions/structgen/helpers/dungeon/room.mcfunction b/data/bktsb/functions/structgen/helpers/dungeon/room.mcfunction
new file mode 100644
index 0000000..1f7cd21
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/dungeon/room.mcfunction
@@ -0,0 +1,4 @@
+fill ~-4 ~-2 ~-4 ~4 ~3 ~4 cobblestone outline
+setblock ~-4 ~-2 ~-4 minecraft:structure_block{name:"bktsb:dungeon_base",mode:"LOAD",ignoreEntities:1,rotation:"NONE",integrity:0.5} replace
+setblock ~-4 ~-1 ~-4 redstone_block
+setblock ~-4 ~-0 ~-4 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/dungeon/room_callback",TrackOutput:0}
diff --git a/data/bktsb/functions/structgen/helpers/dungeon/room_callback.mcfunction b/data/bktsb/functions/structgen/helpers/dungeon/room_callback.mcfunction
new file mode 100644
index 0000000..8db59a6
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/dungeon/room_callback.mcfunction
@@ -0,0 +1,2 @@
+fill ~ ~-2 ~ ~8 ~-2 ~8 cobblestone replace air
+fill ~ ~ ~ ~ ~-2 ~ cobblestone
diff --git a/data/bktsb/functions/structgen/helpers/dungeon/spawner.mcfunction b/data/bktsb/functions/structgen/helpers/dungeon/spawner.mcfunction
new file mode 100644
index 0000000..043156c
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/dungeon/spawner.mcfunction
@@ -0,0 +1,6 @@
+setblock ~ ~ ~ spawner
+scoreboard players set #a lim 4
+function bktsb:rng
+execute if score #a randr matches 0..1 run data merge block ~ ~ ~ {MaxNearbyEntities: 6s, RequiredPlayerRange: 16s, SpawnCount: 4s, SpawnData: {id: "minecraft:zombie"}, MaxSpawnDelay: 800s, Delay: 500s, SpawnRange: 4s, MinSpawnDelay: 200s, SpawnPotentials: [{Entity: {id: "minecraft:zombie"}, Weight: 1}]}
+execute if score #a randr matches 2 run data merge block ~ ~ ~ {MaxNearbyEntities: 6s, RequiredPlayerRange: 16s, SpawnCount: 4s, SpawnData: {id: "minecraft:skeleton"}, MaxSpawnDelay: 800s, Delay: 500s, SpawnRange: 4s, MinSpawnDelay: 200s, SpawnPotentials: [{Entity: {id: "minecraft:skeleton"}, Weight: 1}]}
+execute if score #a randr matches 3 run data merge block ~ ~ ~ {MaxNearbyEntities: 6s, RequiredPlayerRange: 16s, SpawnCount: 4s, SpawnData: {id: "minecraft:spider"}, MaxSpawnDelay: 800s, Delay: 500s, SpawnRange: 4s, MinSpawnDelay: 200s, SpawnPotentials: [{Entity: {id: "minecraft:spider"}, Weight: 1}]}
diff --git a/data/bktsb/functions/structgen/helpers/gen_bastion_helper.mcfunction b/data/bktsb/functions/structgen/helpers/gen_bastion_helper.mcfunction
new file mode 100644
index 0000000..acdb77e
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/gen_bastion_helper.mcfunction
@@ -0,0 +1,29 @@
+fill ~ ~ ~ ~ ~-12 ~ minecraft:air replace minecraft:redstone_block
+setblock ~ ~ ~ minecraft:air
+fill ~-16 ~-10 ~-16 ~16 ~-9 ~16 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_bastion_common_loot_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"bastion_other"}
+fill ~-20 ~-9 ~-20 ~20 ~-7 ~20 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_bastion_treasure_loot_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"bastion_treasure"}
+
+scoreboard players set #a lim 3
+function bktsb:rng
+
+execute if score #a randr matches 1.. run summon piglin_brute ~ ~ ~
+scoreboard players remove #a randr 1
+execute if score #a randr matches 1.. run summon piglin_brute ~ ~ ~
+
+execute as @e[type=piglin_brute,distance=..50] run data merge entity @s {IsImmuneToZombification:1}
+
+scoreboard players set #a lim 5
+function bktsb:rng
+
+execute if score #a randr matches 1.. run summon piglin ~ ~ ~
+scoreboard players remove #a randr 1
+execute if score #a randr matches 1.. run summon piglin ~ ~ ~
+scoreboard players remove #a randr 1
+execute if score #a randr matches 1.. run summon piglin ~ ~ ~
+scoreboard players remove #a randr 1
+execute if score #a randr matches 1.. run summon piglin ~ ~ ~
+
+execute as @e[type=piglin,distance=..50] run data merge entity @s {IsImmuneToZombification:1}
+
+spreadplayers ~ ~ 2 20 false @e[type=piglin_brute,distance=..50]
+spreadplayers ~ ~ 2 20 false @e[type=piglin,distance=..50]
diff --git a/data/bktsb/functions/structgen/helpers/gen_end_ship_east_helper.mcfunction b/data/bktsb/functions/structgen/helpers/gen_end_ship_east_helper.mcfunction
new file mode 100644
index 0000000..c791e15
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/gen_end_ship_east_helper.mcfunction
@@ -0,0 +1,5 @@
+fill ~ ~ ~ ~ ~-29 ~ minecraft:air replace minecraft:redstone_block
+setblock ~ ~ ~ minecraft:air
+fill ~0 ~-25 ~-30 ~-30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_endship_loot_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Chest"}
+fill ~0 ~-25 ~-30 ~-30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_elytra_west_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Elytra"}
+fill ~0 ~-29 ~-30 ~-30 ~-18 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/summon_shulker_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Sentry"}
diff --git a/data/bktsb/functions/structgen/helpers/gen_end_ship_north_helper.mcfunction b/data/bktsb/functions/structgen/helpers/gen_end_ship_north_helper.mcfunction
new file mode 100644
index 0000000..15be5d9
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/gen_end_ship_north_helper.mcfunction
@@ -0,0 +1,5 @@
+fill ~ ~ ~ ~ ~-29 ~ minecraft:air replace minecraft:redstone_block
+setblock ~ ~ ~ minecraft:air
+fill ~-30 ~-25 ~0 ~30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_endship_loot_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Chest"}
+fill ~-30 ~-25 ~0 ~30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_elytra_south_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Elytra"}
+fill ~-30 ~-29 ~0 ~30 ~-18 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/summon_shulker_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Sentry"}
diff --git a/data/bktsb/functions/structgen/helpers/gen_end_ship_south_helper.mcfunction b/data/bktsb/functions/structgen/helpers/gen_end_ship_south_helper.mcfunction
new file mode 100644
index 0000000..ae08db9
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/gen_end_ship_south_helper.mcfunction
@@ -0,0 +1,5 @@
+fill ~ ~ ~ ~ ~-29 ~ minecraft:air replace minecraft:redstone_block
+setblock ~ ~ ~ minecraft:air
+fill ~-30 ~-25 ~0 ~30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_endship_loot_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Chest"}
+fill ~-30 ~-25 ~0 ~30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_elytra_north_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Elytra"}
+fill ~-30 ~-29 ~0 ~30 ~-18 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/summon_shulker_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Sentry"}
diff --git a/data/bktsb/functions/structgen/helpers/gen_end_ship_west_helper.mcfunction b/data/bktsb/functions/structgen/helpers/gen_end_ship_west_helper.mcfunction
new file mode 100644
index 0000000..a9fdfaf
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/gen_end_ship_west_helper.mcfunction
@@ -0,0 +1,5 @@
+fill ~ ~ ~ ~ ~-29 ~ minecraft:air replace minecraft:redstone_block
+setblock ~ ~ ~ minecraft:air
+fill ~0 ~-25 ~-30 ~30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_endship_loot_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Chest"}
+fill ~0 ~-25 ~-30 ~30 ~-24 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/place_elytra_east_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Elytra"}
+fill ~0 ~-29 ~-30 ~30 ~-18 ~30 minecraft:command_block{auto:1,Command:"function bktsb:structgen/helpers/summon_shulker_and_vanish",TrackOutput:0} replace minecraft:structure_block{metadata:"Sentry"}
diff --git a/data/bktsb/functions/structgen/helpers/gen_generic_helper.mcfunction b/data/bktsb/functions/structgen/helpers/gen_generic_helper.mcfunction
new file mode 100644
index 0000000..931d0a5
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/gen_generic_helper.mcfunction
@@ -0,0 +1,2 @@
+fill ~ ~ ~ ~ ~-12 ~ minecraft:air replace minecraft:redstone_block
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_bastion_common_loot_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_bastion_common_loot_and_vanish.mcfunction
new file mode 100644
index 0000000..2e3c599
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_bastion_common_loot_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+data modify block ~ ~-1 ~ LootTable set value "minecraft:chests/bastion_other"
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_bastion_treasure_loot_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_bastion_treasure_loot_and_vanish.mcfunction
new file mode 100644
index 0000000..eebe605
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_bastion_treasure_loot_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+data modify block ~ ~-1 ~ LootTable set value "minecraft:chests/bastion_treasure"
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_elytra_east_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_elytra_east_and_vanish.mcfunction
new file mode 100644
index 0000000..f990cd5
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_elytra_east_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+summon minecraft:item_frame ~ ~ ~ {Facing:5,Item:{id:"minecraft:elytra",Count:1}}
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_elytra_north_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_elytra_north_and_vanish.mcfunction
new file mode 100644
index 0000000..1562eff
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_elytra_north_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+summon minecraft:item_frame ~ ~ ~ {Facing:2,Item:{id:"minecraft:elytra",Count:1}}
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_elytra_south_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_elytra_south_and_vanish.mcfunction
new file mode 100644
index 0000000..0f67b21
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_elytra_south_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+summon minecraft:item_frame ~ ~ ~ {Facing:3,Item:{id:"minecraft:elytra",Count:1}}
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_elytra_west_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_elytra_west_and_vanish.mcfunction
new file mode 100644
index 0000000..a691b3a
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_elytra_west_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+summon minecraft:item_frame ~ ~ ~ {Facing:4,Item:{id:"minecraft:elytra",Count:1}}
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/place_endship_loot_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/place_endship_loot_and_vanish.mcfunction
new file mode 100644
index 0000000..f04df2d
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/place_endship_loot_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+data modify block ~ ~-1 ~ LootTable set value "minecraft:chests/end_city_treasure"
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/structgen/helpers/summon_shulker_and_vanish.mcfunction b/data/bktsb/functions/structgen/helpers/summon_shulker_and_vanish.mcfunction
new file mode 100644
index 0000000..e2384d9
--- /dev/null
+++ b/data/bktsb/functions/structgen/helpers/summon_shulker_and_vanish.mcfunction
@@ -0,0 +1,2 @@
+summon minecraft:shulker ~ ~ ~ {Color:16}
+setblock ~ ~ ~ minecraft:air
diff --git a/data/bktsb/functions/summontrader.mcfunction b/data/bktsb/functions/summontrader.mcfunction
new file mode 100644
index 0000000..f3d3cc6
--- /dev/null
+++ b/data/bktsb/functions/summontrader.mcfunction
@@ -0,0 +1,6 @@
+summon wandering_trader ~ ~ ~
+data modify entity @e[type=minecraft:wandering_trader,limit=1,sort=nearest] DespawnDelay set value 48000
+summon trader_llama ~ ~ ~
+summon trader_llama ~ ~ ~
+execute as @e[type=minecraft:trader_llama,limit=2,sort=nearest] run data modify entity @s DespawnDelay set value 48000
+execute as @e[type=minecraft:trader_llama,limit=2,sort=nearest] run data modify entity @s Leash.UUID set from entity @e[type=minecraft:wandering_trader,limit=1] UUID
diff --git a/data/bktsb/functions/tradecycle.mcfunction b/data/bktsb/functions/tradecycle.mcfunction
new file mode 100644
index 0000000..87c5777
--- /dev/null
+++ b/data/bktsb/functions/tradecycle.mcfunction
@@ -0,0 +1,7 @@
+execute as @e[type=minecraft:trader_llama,distance=..8,limit=2,sort=nearest] run data modify entity @s Leash set value {}
+summon minecraft:wandering_trader ~ ~ ~
+data modify entity @s Silent set value 1
+kill @s
+# original @s no longer valid
+execute as @e[type=minecraft:wandering_trader,limit=1,sort=nearest] at @s run data modify entity @s DespawnDelay set from entity @e[type=minecraft:trader_llama,distance=..8,limit=1,sort=nearest] DespawnDelay
+execute as @e[type=minecraft:trader_llama,distance=..8,limit=2,sort=nearest] run data modify entity @s Leash.UUID set from entity @e[type=minecraft:wandering_trader,limit=1,sort=nearest] UUID
diff --git a/data/bktsb/functions/tradertrades.mcfunction b/data/bktsb/functions/tradertrades.mcfunction
new file mode 100644
index 0000000..a4b4132
--- /dev/null
+++ b/data/bktsb/functions/tradertrades.mcfunction
@@ -0,0 +1,55 @@
+##################################### RANDOM STUFF #####################################
+scoreboard players set #a lim 6
+function bktsb:rng
+
+execute if score #a randr matches 0 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:16,buy:{id:"minecraft:emerald",Count:3},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:cocoa_beans",Count:1}}
+
+execute if score #a randr matches 1 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:16,buy:{id:"minecraft:emerald",Count:9},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:cobweb",Count:16}}
+
+execute if score #a randr matches 2 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:16,buy:{id:"minecraft:emerald",Count:5},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:sweet_berries",Count:1}}
+
+execute if score #a randr matches 3 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:16,buy:{id:"minecraft:emerald_block",Count:3},buyB:{id:"minecraft:netherrack",Count:1},sell:{id:"minecraft:crimson_nylium",Count:1}}
+
+execute if score #a randr matches 4 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:16,buy:{id:"minecraft:emerald_block",Count:3},buyB:{id:"minecraft:netherrack",Count:1},sell:{id:"minecraft:warped_nylium",Count:1}}
+
+execute if score #a randr matches 5 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:16,buy:{id:"minecraft:emerald",Count:5},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:glow_lichen",Count:1}}
+##################################### DOUBLE FLOWERS #####################################
+scoreboard players set #a lim 5
+function bktsb:rng
+
+execute if score #a randr matches 0 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:8,buy:{id:"minecraft:emerald",Count:3},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:sunflower",Count:1}}
+
+execute if score #a randr matches 1 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:8,buy:{id:"minecraft:emerald",Count:3},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:lilac",Count:1}}
+
+execute if score #a randr matches 2 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:8,buy:{id:"minecraft:emerald",Count:3},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:rose_bush",Count:1}}
+
+execute if score #a randr matches 3 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:8,buy:{id:"minecraft:emerald",Count:3},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:peony",Count:1}}
+
+execute if score #a randr matches 4 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:8,buy:{id:"minecraft:stone",Count:64},buyB:{id:"minecraft:charcoal",Count:9},sell:{id:"minecraft:lava_bucket",Count:1}}
+
+##################################### VALUABLE STUFF #####################################
+
+scoreboard players set #a lim 6
+function bktsb:rng
+
+execute if score #a randr matches 0 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:emerald",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:knowledge_book",Count:1,tag:{Recipes:["bktsb:dummy_amethyst"],display:{Name:"{\"text\":\"Geode in a Book\",\"color\":\"#FF00FF\"}"},Enchantments:[{}]}}}
+
+execute if score #a randr matches 1 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:ender_chest",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:knowledge_book",Count:1,tag:{Recipes:["bktsb:dummy1"],display:{Name:"{\"text\":\"End City Ship in a Book\",\"color\":\"#FF00FF\"}"},Enchantments:[{}]}}}
+
+execute if score #a randr matches 2 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:netherite_ingot",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:knowledge_book",Count:1,tag:{Recipes:["bktsb:dummy2"],display:{Name:"{\"text\":\"Bastion in a Book\",\"color\":\"#FF00FF\"}"},Enchantments:[{}]}}}
+
+execute if score #a randr matches 3 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:obsidian",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:knowledge_book",Count:1,tag:{Recipes:["bktsb:dummy3"],display:{Name:"{\"text\":\"Fortress in a Book\",\"color\":\"#FF00FF\"}"},Enchantments:[{}]}}}
+
+execute if score #a randr matches 4 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:diamond",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:knowledge_book",Count:1,tag:{Recipes:["bktsb:dummy4"],display:{Name:"{\"text\":\"Buried Treasure in a Book\",\"color\":\"#FF00FF\"}"},Enchantments:[{}]}}}
+
+execute if score #a randr matches 5 run data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:golden_apple",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:knowledge_book",Count:1,tag:{Recipes:["bktsb:dummy_dungeon"],display:{Name:"{\"text\":\"Dungeon in a Book\",\"color\":\"#FF00FF\"}"},Enchantments:[{}]}}}
+
+##################################### TRADE CYCLING #####################################
+
+data modify entity @e[type=minecraft:wandering_trader,tag=!trade_added,limit=1] Offers.Recipes append value {maxUses:1,buy:{id:"minecraft:emerald_block",Count:30},buyB:{id:"minecraft:air",Count:1},sell:{id:"minecraft:written_book",Count:1,tag:{author:"wandering trader",title:"my wills",display:{Name:"{\"text\":\"Cycle Trades\",\"color\":\"#FF0000\"}"},pages:[],Enchantments:[{}]}}}
+
+execute as @e[type=minecraft:wandering_trader,tag=!trade_added] run tellraw @a ["",{"text":"A wild wandering trader appeared at ","color":"green"},{"nbt":"Pos","entity":"@s"},{"text":" !","color":"green"}]
+execute as @e[type=minecraft:wandering_trader,tag=!trade_added] run playsound minecraft:entity.player.levelup neutral @a ~ ~ ~ 1000000
+tag @e[type=minecraft:wandering_trader,tag=!trade_added] add trade_added
+
+execute as @e[type=minecraft:wandering_trader,limit=1,nbt={Offers:{Recipes:[{sell:{id:"minecraft:written_book",Count:1b,tag:{author:"wandering trader",title:"my wills",display:{Name:"{\"text\":\"Cycle Trades\",\"color\":\"#FF0000\"}"},pages:[],Enchantments:[{}]}},uses:1}]}}] at @s run function bktsb:tradecycle
diff --git a/data/bktsb/predicates/dummy1.json b/data/bktsb/predicates/dummy1.json
new file mode 100644
index 0000000..be61896
--- /dev/null
+++ b/data/bktsb/predicates/dummy1.json
@@ -0,0 +1,7 @@
+{
+ "condition": "minecraft:entity_properties",
+ "entity": "this",
+ "predicate": {
+ "player": {"recipes": {"bktsb:dummy1": true} }
+ }
+}
diff --git a/data/bktsb/predicates/dummy2.json b/data/bktsb/predicates/dummy2.json
new file mode 100644
index 0000000..531dcaf
--- /dev/null
+++ b/data/bktsb/predicates/dummy2.json
@@ -0,0 +1,7 @@
+{
+ "condition": "minecraft:entity_properties",
+ "entity": "this",
+ "predicate": {
+ "player": {"recipes": {"bktsb:dummy2": true} }
+ }
+}
diff --git a/data/bktsb/predicates/dummy3.json b/data/bktsb/predicates/dummy3.json
new file mode 100644
index 0000000..73fd40e
--- /dev/null
+++ b/data/bktsb/predicates/dummy3.json
@@ -0,0 +1,7 @@
+{
+ "condition": "minecraft:entity_properties",
+ "entity": "this",
+ "predicate": {
+ "player": {"recipes": {"bktsb:dummy3": true} }
+ }
+}
diff --git a/data/bktsb/predicates/dummy4.json b/data/bktsb/predicates/dummy4.json
new file mode 100644
index 0000000..a3638e5
--- /dev/null
+++ b/data/bktsb/predicates/dummy4.json
@@ -0,0 +1,7 @@
+{
+ "condition": "minecraft:entity_properties",
+ "entity": "this",
+ "predicate": {
+ "player": {"recipes": {"bktsb:dummy4": true} }
+ }
+}
diff --git a/data/bktsb/predicates/dummy_amethyst.json b/data/bktsb/predicates/dummy_amethyst.json
new file mode 100644
index 0000000..d69fb5d
--- /dev/null
+++ b/data/bktsb/predicates/dummy_amethyst.json
@@ -0,0 +1,7 @@
+{
+ "condition": "minecraft:entity_properties",
+ "entity": "this",
+ "predicate": {
+ "player": {"recipes": {"bktsb:dummy_amethyst": true} }
+ }
+}
diff --git a/data/bktsb/predicates/dummy_dungeon.json b/data/bktsb/predicates/dummy_dungeon.json
new file mode 100644
index 0000000..368d763
--- /dev/null
+++ b/data/bktsb/predicates/dummy_dungeon.json
@@ -0,0 +1,7 @@
+{
+ "condition": "minecraft:entity_properties",
+ "entity": "this",
+ "predicate": {
+ "player": {"recipes": {"bktsb:dummy_dungeon": true} }
+ }
+}
diff --git a/data/bktsb/recipes/braincoralblock.json b/data/bktsb/recipes/braincoralblock.json
new file mode 100644
index 0000000..057ded7
--- /dev/null
+++ b/data/bktsb/recipes/braincoralblock.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "###",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:brain_coral"
+ }
+ },
+ "result": {
+ "item": "minecraft:brain_coral_block"
+ }
+}
diff --git a/data/bktsb/recipes/bubblecoralblock.json b/data/bktsb/recipes/bubblecoralblock.json
new file mode 100644
index 0000000..4185bda
--- /dev/null
+++ b/data/bktsb/recipes/bubblecoralblock.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "###",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:bubble_coral"
+ }
+ },
+ "result": {
+ "item": "minecraft:bubble_coral_block"
+ }
+}
diff --git a/data/bktsb/recipes/coalore.json b/data/bktsb/recipes/coalore.json
new file mode 100644
index 0000000..73433c9
--- /dev/null
+++ b/data/bktsb/recipes/coalore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:coal_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:coal_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/copperore.json b/data/bktsb/recipes/copperore.json
new file mode 100644
index 0000000..380bbfe
--- /dev/null
+++ b/data/bktsb/recipes/copperore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:copper_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:copper_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslatecoalore.json b/data/bktsb/recipes/deepslatecoalore.json
new file mode 100644
index 0000000..f5f46a7
--- /dev/null
+++ b/data/bktsb/recipes/deepslatecoalore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:coal_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_coal_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslatecopperore.json b/data/bktsb/recipes/deepslatecopperore.json
new file mode 100644
index 0000000..08e6999
--- /dev/null
+++ b/data/bktsb/recipes/deepslatecopperore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:copper_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_copper_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslatediamondore.json b/data/bktsb/recipes/deepslatediamondore.json
new file mode 100644
index 0000000..fcf405e
--- /dev/null
+++ b/data/bktsb/recipes/deepslatediamondore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:diamond_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_diamond_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslateemeraldore.json b/data/bktsb/recipes/deepslateemeraldore.json
new file mode 100644
index 0000000..0c6ec1c
--- /dev/null
+++ b/data/bktsb/recipes/deepslateemeraldore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:emerald_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_emerald_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslategoldore.json b/data/bktsb/recipes/deepslategoldore.json
new file mode 100644
index 0000000..08fbe6d
--- /dev/null
+++ b/data/bktsb/recipes/deepslategoldore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:gold_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_gold_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslateironore.json b/data/bktsb/recipes/deepslateironore.json
new file mode 100644
index 0000000..246f391
--- /dev/null
+++ b/data/bktsb/recipes/deepslateironore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:iron_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_iron_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslatelapisore.json b/data/bktsb/recipes/deepslatelapisore.json
new file mode 100644
index 0000000..82d02c3
--- /dev/null
+++ b/data/bktsb/recipes/deepslatelapisore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:lapis_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_lapis_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/deepslateredstore.json b/data/bktsb/recipes/deepslateredstore.json
new file mode 100644
index 0000000..2f4a75a
--- /dev/null
+++ b/data/bktsb/recipes/deepslateredstore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:redstone_block"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ },
+ {
+ "item": "minecraft:deepslate"
+ }
+ ],
+ "result": {
+ "item": "minecraft:deepslate_redstone_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/diamondore.json b/data/bktsb/recipes/diamondore.json
new file mode 100644
index 0000000..ead29be
--- /dev/null
+++ b/data/bktsb/recipes/diamondore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:diamond_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:diamond_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/dummy1.json b/data/bktsb/recipes/dummy1.json
new file mode 100644
index 0000000..cdd69ff
--- /dev/null
+++ b/data/bktsb/recipes/dummy1.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "dd"
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:debug_stick"
+ }
+ },
+ "result": {
+ "item": "minecraft:debug_stick",
+ "count": 1
+ },
+ "group": "dummy"
+}
diff --git a/data/bktsb/recipes/dummy2.json b/data/bktsb/recipes/dummy2.json
new file mode 100644
index 0000000..17bd38f
--- /dev/null
+++ b/data/bktsb/recipes/dummy2.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "ddd"
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:debug_stick"
+ }
+ },
+ "result": {
+ "item": "minecraft:debug_stick",
+ "count": 1
+ },
+ "group": "dummy"
+}
diff --git a/data/bktsb/recipes/dummy3.json b/data/bktsb/recipes/dummy3.json
new file mode 100644
index 0000000..636541b
--- /dev/null
+++ b/data/bktsb/recipes/dummy3.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "ddd",
+ " d "
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:debug_stick"
+ }
+ },
+ "result": {
+ "item": "minecraft:debug_stick",
+ "count": 1
+ },
+ "group": "dummy"
+}
diff --git a/data/bktsb/recipes/dummy4.json b/data/bktsb/recipes/dummy4.json
new file mode 100644
index 0000000..cbee78a
--- /dev/null
+++ b/data/bktsb/recipes/dummy4.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "ddd",
+ "dd "
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:debug_stick"
+ }
+ },
+ "result": {
+ "item": "minecraft:debug_stick",
+ "count": 1
+ },
+ "group": "dummy"
+}
diff --git a/data/bktsb/recipes/dummy_amethyst.json b/data/bktsb/recipes/dummy_amethyst.json
new file mode 100644
index 0000000..1d56a7d
--- /dev/null
+++ b/data/bktsb/recipes/dummy_amethyst.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "ddd",
+ "ddd"
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:debug_stick"
+ }
+ },
+ "result": {
+ "item": "minecraft:debug_stick",
+ "count": 1
+ },
+ "group": "dummy"
+}
diff --git a/data/bktsb/recipes/dummy_dungeon.json b/data/bktsb/recipes/dummy_dungeon.json
new file mode 100644
index 0000000..ace3944
--- /dev/null
+++ b/data/bktsb/recipes/dummy_dungeon.json
@@ -0,0 +1,18 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "ddd",
+ "ddd",
+ "d "
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:debug_stick"
+ }
+ },
+ "result": {
+ "item": "minecraft:debug_stick",
+ "count": 1
+ },
+ "group": "dummy"
+}
diff --git a/data/bktsb/recipes/egapple.json b/data/bktsb/recipes/egapple.json
new file mode 100644
index 0000000..3412f1d
--- /dev/null
+++ b/data/bktsb/recipes/egapple.json
@@ -0,0 +1,19 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "#X#",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:gold_block"
+ },
+ "X": {
+ "item": "minecraft:apple"
+ }
+ },
+ "result": {
+ "item": "minecraft:enchanted_golden_apple"
+ }
+}
diff --git a/data/bktsb/recipes/emeraldore.json b/data/bktsb/recipes/emeraldore.json
new file mode 100644
index 0000000..62dc6c1
--- /dev/null
+++ b/data/bktsb/recipes/emeraldore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:emerald_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:emerald_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/endstone.json b/data/bktsb/recipes/endstone.json
new file mode 100644
index 0000000..1fa2804
--- /dev/null
+++ b/data/bktsb/recipes/endstone.json
@@ -0,0 +1,23 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "eXe",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:cobblestone"
+ },
+ "X": {
+ "item": "minecraft:ender_pearl"
+ },
+ "e": {
+ "item": "minecraft:egg"
+ }
+ },
+ "result": {
+ "item": "minecraft:end_stone",
+ "count": 6
+ }
+}
diff --git a/data/bktsb/recipes/firecoralblock.json b/data/bktsb/recipes/firecoralblock.json
new file mode 100644
index 0000000..63768a8
--- /dev/null
+++ b/data/bktsb/recipes/firecoralblock.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "###",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:fire_coral"
+ }
+ },
+ "result": {
+ "item": "minecraft:fire_coral_block"
+ }
+}
diff --git a/data/bktsb/recipes/gildedblackst.json b/data/bktsb/recipes/gildedblackst.json
new file mode 100644
index 0000000..c25e60f
--- /dev/null
+++ b/data/bktsb/recipes/gildedblackst.json
@@ -0,0 +1,20 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "#X#",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:blackstone"
+ },
+ "X": {
+ "item": "minecraft:gold_ingot"
+ }
+ },
+ "result": {
+ "item": "minecraft:gilded_blackstone",
+ "count": 6
+ }
+}
diff --git a/data/bktsb/recipes/goldore.json b/data/bktsb/recipes/goldore.json
new file mode 100644
index 0000000..65de1c6
--- /dev/null
+++ b/data/bktsb/recipes/goldore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:gold_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:gold_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/horncoralblock.json b/data/bktsb/recipes/horncoralblock.json
new file mode 100644
index 0000000..28f8a55
--- /dev/null
+++ b/data/bktsb/recipes/horncoralblock.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "###",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:horn_coral"
+ }
+ },
+ "result": {
+ "item": "minecraft:horn_coral_block"
+ }
+}
diff --git a/data/bktsb/recipes/ironore.json b/data/bktsb/recipes/ironore.json
new file mode 100644
index 0000000..6531c28
--- /dev/null
+++ b/data/bktsb/recipes/ironore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:iron_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:iron_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/lapisore.json b/data/bktsb/recipes/lapisore.json
new file mode 100644
index 0000000..bb6b775
--- /dev/null
+++ b/data/bktsb/recipes/lapisore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:lapis_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:lapis_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/nethergoldore.json b/data/bktsb/recipes/nethergoldore.json
new file mode 100644
index 0000000..523f908
--- /dev/null
+++ b/data/bktsb/recipes/nethergoldore.json
@@ -0,0 +1,20 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "#X#",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:netherrack"
+ },
+ "X": {
+ "item": "minecraft:gold_block"
+ }
+ },
+ "result": {
+ "item": "minecraft:nether_gold_ore",
+ "count": 8
+ }
+}
diff --git a/data/bktsb/recipes/quartzore.json b/data/bktsb/recipes/quartzore.json
new file mode 100644
index 0000000..5019210
--- /dev/null
+++ b/data/bktsb/recipes/quartzore.json
@@ -0,0 +1,18 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:quartz_block"
+ },
+ {
+ "item": "minecraft:netherrack"
+ },
+ {
+ "item": "minecraft:netherrack"
+ }
+ ],
+ "result": {
+ "item": "minecraft:nether_quartz_ore",
+ "count": 2
+ }
+}
diff --git a/data/bktsb/recipes/redsand.json b/data/bktsb/recipes/redsand.json
new file mode 100644
index 0000000..3394856
--- /dev/null
+++ b/data/bktsb/recipes/redsand.json
@@ -0,0 +1,20 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "#X#",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:sand"
+ },
+ "X": {
+ "item": "minecraft:rotten_flesh"
+ }
+ },
+ "result": {
+ "item": "minecraft:red_sand",
+ "count": 8
+ }
+}
diff --git a/data/bktsb/recipes/redstore.json b/data/bktsb/recipes/redstore.json
new file mode 100644
index 0000000..7bf5b9d
--- /dev/null
+++ b/data/bktsb/recipes/redstore.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:redstone_block"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ },
+ {
+ "item": "minecraft:stone"
+ }
+ ],
+ "result": {
+ "item": "minecraft:redstone_ore",
+ "count": 3
+ }
+}
diff --git a/data/bktsb/recipes/soulsoil.json b/data/bktsb/recipes/soulsoil.json
new file mode 100644
index 0000000..ebf05e9
--- /dev/null
+++ b/data/bktsb/recipes/soulsoil.json
@@ -0,0 +1,19 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "sd",
+ "ds"
+ ],
+ "key": {
+ "d": {
+ "item": "minecraft:dirt"
+ },
+ "s": {
+ "item": "minecraft:soul_sand"
+ }
+ },
+ "result": {
+ "item": "minecraft:soul_soil",
+ "count": 4
+ }
+}
diff --git a/data/bktsb/recipes/tubecoralblock.json b/data/bktsb/recipes/tubecoralblock.json
new file mode 100644
index 0000000..d41d1cb
--- /dev/null
+++ b/data/bktsb/recipes/tubecoralblock.json
@@ -0,0 +1,16 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "pattern": [
+ "###",
+ "###",
+ "###"
+ ],
+ "key": {
+ "#": {
+ "item": "minecraft:tube_coral"
+ }
+ },
+ "result": {
+ "item": "minecraft:tube_coral_block"
+ }
+}
diff --git a/data/bktsb/structures/dungeon_base.nbt b/data/bktsb/structures/dungeon_base.nbt
new file mode 100644
index 0000000..cb0a3d8
--- /dev/null
+++ b/data/bktsb/structures/dungeon_base.nbt
Binary files differ
diff --git a/data/bktsb/structures/island.nbt b/data/bktsb/structures/island.nbt
new file mode 100644
index 0000000..e893d2a
--- /dev/null
+++ b/data/bktsb/structures/island.nbt
Binary files differ
diff --git a/data/bktsb/structures/nether/bastion1.nbt b/data/bktsb/structures/nether/bastion1.nbt
new file mode 100644
index 0000000..ada71db
--- /dev/null
+++ b/data/bktsb/structures/nether/bastion1.nbt
Binary files differ
diff --git a/data/bktsb/structures/nether/bastion2.nbt b/data/bktsb/structures/nether/bastion2.nbt
new file mode 100644
index 0000000..6a5f470
--- /dev/null
+++ b/data/bktsb/structures/nether/bastion2.nbt
Binary files differ
diff --git a/data/bktsb/structures/nether/bastion3.nbt b/data/bktsb/structures/nether/bastion3.nbt
new file mode 100644
index 0000000..be42e2f
--- /dev/null
+++ b/data/bktsb/structures/nether/bastion3.nbt
Binary files differ
diff --git a/data/bktsb/structures/nether/bastion4.nbt b/data/bktsb/structures/nether/bastion4.nbt
new file mode 100644
index 0000000..a09dd6a
--- /dev/null
+++ b/data/bktsb/structures/nether/bastion4.nbt
Binary files differ
diff --git a/data/bktsb/structures/nether/fortress.nbt b/data/bktsb/structures/nether/fortress.nbt
new file mode 100644
index 0000000..688e8c8
--- /dev/null
+++ b/data/bktsb/structures/nether/fortress.nbt
Binary files differ
diff --git a/data/minecraft/dimension_type/overworld.json b/data/minecraft/dimension_type/overworld.json
new file mode 100644
index 0000000..9b21a4a
--- /dev/null
+++ b/data/minecraft/dimension_type/overworld.json
@@ -0,0 +1,17 @@
+{
+ "logical_height": 384,
+ "infiniburn": "minecraft:infiniburn_overworld",
+ "effects": "minecraft:overworld",
+ "ambient_light": 0.0,
+ "respawn_anchor_works": false,
+ "has_raids": true,
+ "min_y": -64,
+ "height": 384,
+ "natural": true,
+ "coordinate_scale": 1.0,
+ "piglin_safe": false,
+ "bed_works": true,
+ "has_skylight": true,
+ "has_ceiling": false,
+ "ultrawarm": false
+} \ No newline at end of file
diff --git a/data/minecraft/dimension_type/overworld_caves.json b/data/minecraft/dimension_type/overworld_caves.json
new file mode 100644
index 0000000..f4ea040
--- /dev/null
+++ b/data/minecraft/dimension_type/overworld_caves.json
@@ -0,0 +1,17 @@
+{
+ "logical_height": 384,
+ "infiniburn": "minecraft:infiniburn_overworld",
+ "effects": "minecraft:overworld",
+ "ambient_light": 0.0,
+ "respawn_anchor_works": false,
+ "has_raids": true,
+ "min_y": -64,
+ "height": 384,
+ "natural": true,
+ "coordinate_scale": 1.0,
+ "piglin_safe": false,
+ "bed_works": true,
+ "has_skylight": true,
+ "has_ceiling": true,
+ "ultrawarm": false
+} \ No newline at end of file
diff --git a/data/minecraft/loot_tables/chests/end_city_treasure.json b/data/minecraft/loot_tables/chests/end_city_treasure.json
new file mode 100644
index 0000000..172fdfe
--- /dev/null
+++ b/data/minecraft/loot_tables/chests/end_city_treasure.json
@@ -0,0 +1,345 @@
+{
+ "type": "minecraft:chest",
+ "pools": [
+ {
+ "rolls": {
+ "min": 2.0,
+ "max": 6.0,
+ "type": "minecraft:uniform"
+ },
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "weight": 5,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 2.0,
+ "max": 7.0,
+ "type": "minecraft:uniform"
+ }
+ }
+ ],
+ "name": "minecraft:diamond"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 10,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 4.0,
+ "max": 8.0,
+ "type": "minecraft:uniform"
+ }
+ }
+ ],
+ "name": "minecraft:iron_ingot"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 15,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 2.0,
+ "max": 7.0,
+ "type": "minecraft:uniform"
+ }
+ }
+ ],
+ "name": "minecraft:gold_ingot"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 7,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 1.0,
+ "max": 4.0,
+ "type": "minecraft:uniform"
+ }
+ }
+ ],
+ "name": "minecraft:chorus_flower"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 2,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 2.0,
+ "max": 6.0,
+ "type": "minecraft:uniform"
+ }
+ }
+ ],
+ "name": "minecraft:emerald"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 5,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 1.0,
+ "max": 10.0,
+ "type": "minecraft:uniform"
+ }
+ }
+ ],
+ "name": "minecraft:beetroot_seeds"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "name": "minecraft:saddle"
+ },
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:iron_horse_armor"
+ },
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:golden_horse_armor"
+ },
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:diamond_horse_armor"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_sword"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_boots"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_chestplate"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_leggings"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_helmet"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_pickaxe"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:diamond_shovel"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_sword"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_boots"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_chestplate"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_leggings"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_helmet"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_pickaxe"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 3,
+ "functions": [
+ {
+ "function": "minecraft:enchant_with_levels",
+ "levels": {
+ "min": 20.0,
+ "max": 39.0,
+ "type": "minecraft:uniform"
+ },
+ "treasure": true
+ }
+ ],
+ "name": "minecraft:iron_shovel"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/blaze.json b/data/minecraft/loot_tables/entities/blaze.json
new file mode 100644
index 0000000..c9897f2
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/blaze.json
@@ -0,0 +1,67 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:blaze_rod"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:nether_wart"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/creeper.json b/data/minecraft/loot_tables/entities/creeper.json
new file mode 100644
index 0000000..7f13fbd
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/creeper.json
@@ -0,0 +1,81 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:gunpowder"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:gravel"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ }
+ ]
+ },
+ {
+ "rolls": 1.0,
+ "entries": [
+ {
+ "type": "minecraft:tag",
+ "name": "minecraft:creeper_drop_music_discs",
+ "expand": true
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:entity_properties",
+ "predicate": {
+ "type": "#minecraft:skeletons"
+ },
+ "entity": "killer"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/evoker.json b/data/minecraft/loot_tables/entities/evoker.json
new file mode 100644
index 0000000..dc31f05
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/evoker.json
@@ -0,0 +1,45 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:totem_of_undying"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:diamond"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/husk.json b/data/minecraft/loot_tables/entities/husk.json
new file mode 100644
index 0000000..bb6d7e8
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/husk.json
@@ -0,0 +1,54 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:sand"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:iron_ingot"
+ },
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:dead_bush"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ },
+ {
+ "condition": "minecraft:random_chance_with_looting",
+ "chance": 0.025,
+ "looting_multiplier": 0.01
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/magma_cube.json b/data/minecraft/loot_tables/entities/magma_cube.json
new file mode 100644
index 0000000..7429c83
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/magma_cube.json
@@ -0,0 +1,50 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": -2.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:magma_cream"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:ancient_debris"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ },
+ {
+ "condition": "minecraft:random_chance_with_looting",
+ "chance": 0.015,
+ "looting_multiplier": 0.01
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/shulker.json b/data/minecraft/loot_tables/entities/shulker.json
new file mode 100644
index 0000000..767a395
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/shulker.json
@@ -0,0 +1,31 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:shulker_shell"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/witch.json b/data/minecraft/loot_tables/entities/witch.json
new file mode 100644
index 0000000..30f206b
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/witch.json
@@ -0,0 +1,183 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": {
+ "min": 1.0,
+ "max": 3.0,
+ "type": "minecraft:uniform"
+ },
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:glowstone_dust"
+ },
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:sugar"
+ },
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:redstone"
+ },
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:spider_eye"
+ },
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:glass_bottle"
+ },
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:gunpowder"
+ },
+ {
+ "type": "minecraft:item",
+ "weight": 2,
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:stick"
+ },
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:brown_mushroom"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/zombie.json b/data/minecraft/loot_tables/entities/zombie.json
new file mode 100644
index 0000000..0dcb8ec
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/zombie.json
@@ -0,0 +1,89 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:rotten_flesh"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:iron_ingot"
+ },
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:carrot"
+ },
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:potato"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ },
+ {
+ "condition": "minecraft:random_chance_with_looting",
+ "chance": 0.025,
+ "looting_multiplier": 0.01
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:clay_ball"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/loot_tables/entities/zombified_piglin.json b/data/minecraft/loot_tables/entities/zombified_piglin.json
new file mode 100644
index 0000000..4b37ef3
--- /dev/null
+++ b/data/minecraft/loot_tables/entities/zombified_piglin.json
@@ -0,0 +1,107 @@
+{
+ "type": "minecraft:entity",
+ "pools": [
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:rotten_flesh"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 2.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:netherrack"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "functions": [
+ {
+ "function": "minecraft:set_count",
+ "count": {
+ "min": 0.0,
+ "max": 1.0,
+ "type": "minecraft:uniform"
+ }
+ },
+ {
+ "function": "minecraft:looting_enchant",
+ "count": {
+ "min": 0.0,
+ "max": 1.0
+ }
+ }
+ ],
+ "name": "minecraft:gold_nugget"
+ }
+ ]
+ },
+ {
+ "rolls": 1,
+ "entries": [
+ {
+ "type": "minecraft:item",
+ "name": "minecraft:gold_ingot"
+ }
+ ],
+ "conditions": [
+ {
+ "condition": "minecraft:killed_by_player"
+ },
+ {
+ "condition": "minecraft:random_chance_with_looting",
+ "chance": 0.025,
+ "looting_multiplier": 0.01
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/minecraft/tags/functions/load.json b/data/minecraft/tags/functions/load.json
new file mode 100644
index 0000000..ce6186a
--- /dev/null
+++ b/data/minecraft/tags/functions/load.json
@@ -0,0 +1,5 @@
+{
+ "values": [
+ "bktsb:init"
+ ]
+}
diff --git a/data/minecraft/tags/functions/tick.json b/data/minecraft/tags/functions/tick.json
new file mode 100644
index 0000000..a2b774c
--- /dev/null
+++ b/data/minecraft/tags/functions/tick.json
@@ -0,0 +1,7 @@
+{
+ "values": [
+ "bktsb:tradertrades",
+ "bktsb:booklistener",
+ "bktsb:structgen/helpers/amethyst/ray_tick"
+ ]
+}