aboutsummaryrefslogtreecommitdiff
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
downloadbktmc-skyblock-77f0e689f84a601f5da4aaf2308bccf74a531346.tar.xz
Initial public release (minecraft 1.17.1).
-rw-r--r--.gitignore1
-rw-r--r--README.md21
-rw-r--r--blocks.txt106
-rw-r--r--changelog.txt48
-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
-rw-r--r--features.txt66
-rw-r--r--items.txt177
-rw-r--r--mobs.txt73
-rw-r--r--pack.mcmeta6
-rw-r--r--version.txt2
113 files changed, 2706 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..727bc05
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.directory
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..99bc085
--- /dev/null
+++ b/README.md
@@ -0,0 +1,21 @@
+# Data Pack for the BearKidsTeam Skyblock Server
+
+## Additions and Changes to the Vanilla Game
+
+**TODO**
+
+## Please note ...
+
+ - You need command blocks enabled on the server so the data pack can function correctly.
+
+ - Written for and tested on vanilla / fabric servers. Might not work on other servers.
+
+ - You may want to comment out island generation once the starting island is generated because I couldn't figure out how to reliably disable it automatically (besides placing a bedrock there).
+
+ - This datapack is written for a small SMP skyblock server, i.e. without a huge playerbase in mind. Some stuff may break if used on a huge server (mainly the structure books).
+
+ - Structure books are **destructive**. They will erase anything within the bounding box of the generated structure. (Well, they don't _always_ do that. But don't let your guard down.)
+
+## Copyright
+
+Some of the JSON files (loot tables, dimension configuration) are pulled from official sources and modified based upon them. This is permitted by Mojang's EULA and Mojang holds the copyright of these files. Everything else in this data pack is licensed under the MIT (Expat) License.
diff --git a/blocks.txt b/blocks.txt
new file mode 100644
index 0000000..eaeb167
--- /dev/null
+++ b/blocks.txt
@@ -0,0 +1,106 @@
+Legend
+
+category
+i : infinite
+ii: infinite after initial acquirement, slow initial acquirement
+iu: infinite after initial acquirement, no initial acquirement
+r : unreliable renewable in vanilla
+u : non renewable in vanilla
+c : crafted only
+
+method of obtaining ("uncrafting" methods omitted)
+* : mechanics added by this pack
+# : unavailable in vanilla skyblock
+##: unavailable in vanilla skyblock before initial acquirement
+$ : unreliable / slow
+
+gravel i wg#, batering (late), ?* (early obtaining)
+magma i wg#, crafting
+obsidian i wg#, np$, formed (lava)
+clay r wg#, villager gift, zombie drop*
+terracotta c wg#, trading, crafting
+dirt i wg#, tilling coarse dirt
+coarse dirt i wg#, gravel+dirt
+grass i wg#, spread
+ice i wg#, water freezing
+packedice i wg#, crafting
+blueice i wg#, crafting
+mycelium i wg#, spreading
+podzol i wg#, spruce tree, wt trades$
+sand r wg#, wt trades$, husk drop*, chest loot#
+redsand r wg#, wt trades$, crafting*
+sandst r wg#, crafting
+snow i wg#, snowing
+stone i wg#, crafting
+granite/p i wg#, crafting
+diorite/p i wg#, crafting
+andesite/p i wg#, crafting
+coal ore u wg#, crafting*
+diamond ore u wg#, crafting*
+emerald ore u wg#, crafting*
+gold ore u wg#, crafting*
+nethergold u wg#, crafting*
+iron ore u wg#, crafting*
+lapis ore u wg#, crafting*
+redst ore u wg#, crafting*
+lava u wg#, wt trades$, bastioninabook
+water i wg#, source formation, cauldron
+basalt i wg#, blueicelava
+blackst i wg#, batering
+glowst i wg#, crafting
+netherrack u wg#, zombiepig drop*
+nylium iu wg#, spread, wt trades*
+soul sand i wg#, batering
+soul soil r wg#, soul campfire, crafting*
+ancientdeb u wg#, chest loot#, magma cube drop*
+quartz ore u wg#, crafting*
+endstone r wg#, portal spawn, crafting*
+sponge u wg#, elderguardian drop#, guardian drop*
+
+gildedblackst u wg#, chest loot#, crafting*
+deadbush u wg#, husk drop*
+chorus flower iu wg#, wt trades$, farming
+coral i wg#, bonemeal
+coralblock r wg#, wt trades$, crafting*
+mushroom iu wg#, mooshroom shearing
+fungus i wg#, bonemeal
+netherwart iu wg#, farming, blaze drop*
+spawners u
+ cavesp u
+ silfsh u
+ skele u
+ spider u
+ zombie u
+ blaze u fortressinabook
+ magama u bastioninabook
+
+=======================1.17=======================
+amethy clst iu wg#, budding amethyst##, geodeinabook*
+azalea i wg#, moss##
+azalea lvs iu wg#, azalea##
+amethy blk i wg#, geodeinabook*
+cu blk+v c,i ores, drowned drop
+raw blk c ores drop#
+bud amethy u wg#, geodeinabook*
+calcite u wg#, geodeinabook*, crafting*
+candle c
+cavevines iu wg#, chests#, dungeoninabook*?
+deepslate* u wg#, crafting*
+copperore u wg#, crafting*
+dripleaf r wg#, wt trades$
+dripst blk i wg#, trading, crafting
+glitemfram c
+glowlichen iu wg#, bonemeal, wt trades*
+hangroots i wg#, hoe rooted dirt
+light -
+lightngrod c
+moss i wg#, wt trades, bonemeal
+mosscarpet i wg#, bonemeal
+pointdripst i wg#, wt trades, growing
+powdersnow i wg#, cauldron
+rooteddirt i wg#, azalea
+sculksensor -
+smoothbaslt i wg#, baslt, geodeinabook*
+sporeblosm -
+tintglass c
+tuff i wg#, crafting*
diff --git a/changelog.txt b/changelog.txt
new file mode 100644
index 0000000..b375d23
--- /dev/null
+++ b/changelog.txt
@@ -0,0 +1,48 @@
+rev 1: initial production version.
+
+rev 2 (production only): disabled island generation.
+
+rev 3: witch drops brown mushroom.
+
+rev 4: structure books function correctly in other dimensions.
+ wandering traders announce their arrival.
+
+rev 5: trade cycling for wandering traders.
+
+rev 6: endcity chests now give chorus flower.
+
+rev 7: initlal 1.17 bring up.
+ recipes:
+ nerfed iron & gold ore crafting: recipe yields 8 -> 3.
+ new recipes:
+ cobbled deepslate:
+ 8 cobblestone + 1 gravel -> 4 cobbled deepslate
+ tuff:
+ 8 basalt + 1 obsidian -> 9 tuff
+ calcite:
+ 8 dripstone + 1 bonemeal -> 8 calcite
+
+ loot tables:
+ fishing loot table reverted to vanilla
+
+ wandering traders:
+ wandering traders no longer sell shulker spawn eggs.
+ end city in a book price adjusted: 30 shulker shells -> 30 ender chests.
+ wandering traders sells glow lichen for 5 diamonds.
+ wandering traders sells geodes book for 30 emeralds.
+ wandering traders sells dungeon book for 30 golden apples.
+
+ structure books:
+ dungeon in a book
+ - always 9x6x9 and with a roof
+ - only generates the spawner if used while standing on a gold block
+ - always generates with two chests, one with dungeon loot,
+ one with mineshaft loot (for glow berries).
+ geode in a book
+ - always bound within a 11x11x11 cube
+ - must be used while standing on a diamond block, otherwise generates
+ without budding amethyst.
+ - 16~40 budding amethysts tries to generate, if the prerequisite is met.
+
+ general:
+ building limits adjusted to their 1.18 values.
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"
+ ]
+}
diff --git a/features.txt b/features.txt
new file mode 100644
index 0000000..59b1358
--- /dev/null
+++ b/features.txt
@@ -0,0 +1,66 @@
+* tweaked loot tables
+
+ zombie -> clay ball (player kill)
+ magma cube -> ancient debris (player kill)
+ blaze -> netherwart (player kill)
+ husk -> dead bush (player kill)
+ husk -> sand (any kill) -x-> rotten flesh
+ creeper -> gravel (player kill)
+ zombiepig -> netherrack (player kill)
+ evoker -> diamond (player kill)
+ fishing -> horsearmor
+ witch -> brown mushroom
+ end city chest -> chorus flower
+
+* extra wandering trader trades
+
+3 extra trades are added to each wandering trader.
+
+randomly pick one of these (16 uses each):
+ 3 emerald -> cocoa beans
+ 1 emerald block -> 16 cobweb
+ 5 emerald -> sweetberries
+ 5 emerald -> glowlichen
+ netherrack + 3 emerald blocks -> nylium
+
+one of these (8 uses each):
+ 3 emerald -> sunflower
+ 3 emerald -> lilac
+ 3 emerald -> rosebush
+ 3 emerald -> peony
+ 64 stone + 1 charcoal -> lavabucket
+
+... and one of these (1 use each except first one):
+ ~~30 emeralds -> shulker spawn egg~~
+ ~~30 shulker shells -> end city ship book~~
+ 30 emeralds -> geodes book
+ 30 goldenapples -> dungeon book
+ 30 ender chests -> end city ship book
+ 30 diamonds -> buried treasure book
+ 30 netherrite ingots -> bastion book
+ 30 obsidian -> fortress book
+
+finally, the almighty...
+ 30 emerald blocks -> cycle wandering trader trades
+
+* extra crafting recipes
+
+ Notch apple
+ redsand
+ ores (coal, diamond, emerald, lapis, redst, copper, quartz; gold, iron, nethergold)
+ endstone
+ gildedblackst
+ soul soil
+ calcite
+ deepslate
+ tuff
+ coralblock
+
+* structure books
+ for items/blocks only obtainable from generated structures
+ * end city ship (elytra)
+ * bastion treasure room (magma cube spawner, piglin banner, pigstep)
+ * netherfortress junction (blaze spawner)
+ * buried treasure (heart of the sea)
+ * amethyst geodes
+ * dungeons (mob spawner)
diff --git a/items.txt b/items.txt
new file mode 100644
index 0000000..c1a81ad
--- /dev/null
+++ b/items.txt
@@ -0,0 +1,177 @@
+Legend
+
+category
+i : infinite
+ii: infinite after initial acquirement, slow initial acquirement
+iu: infinite after initial acquirement, no initial acquirement
+r : unreliable renewable in vanilla
+u : non renewable in vanilla
+c : crafted only
+
+method of obtaining ("uncrafting" methods omitted)
+* : mechanics added by this pack
+# : unavailable in vanilla skyblock
+##: unavailable in vanilla skyblock before initial acquirement
+$ : unreliable / slow
+
+beetroot seeds ii farming##, wt trades$, endcity loot*, other chest loot#
+blaze rod i blaze
+bone i skeleton & variants, chest loot#, fishing
+clay ball r clay#, villager gift$, zombie*
+coal i ore#, chest loot#, wither skeleton
+char coal i wood
+cocoa beans iu farming##, wt trades$*
+diamond u ore#, ???
+dragon's breath i dragon
+emerald i ore#, trading, chest loot#, vindicator, evoker
+ender pearl i enderman, trading, bartering
+feather i chicken, parrot, chest loot#, cat gift
+flint i gravel#, trading, chest loot#
+ghast tear i ghast
+glowst dust i glowstone, witch
+gunpowder i creeper, ghast, witch, wt trades$, chest loot#
+heartofthesea u chest loot#, treasure in a book*
+honeycomb i beehive
+inksac i squid, fishing
+lapis i ore#, villager gift$, trading, chest loot#
+leather i cow &c, fishing, bartering, chest loot#
+magamacream i magama cube, crafted
+melon seeds ii melon slice##, wg#, chest loot#, wt trades
+nautilus shell i fishing, drowned, wt trades
+quartz i ore#, chest loot#, bartering
+netherstar i wither
+wart ii farming##, chest loot#, blazedrop*
+netheritescrap u crafted, chest loot#
+phantommemb i phantom
+prismarineshrd i guardian
+prismarinecrys i guardian, chest loot(*)
+pumpkinseeds ii pumpkin##, wg#, chest loot#, wt trades
+rabbithide i rabbit, cat gift
+rabbitfoot i rabbit, cat gift
+redstdust i ore#, wg#, witch, trading, villager gift, chest loot#
+scute i turtle
+shulkershell u shulker
+slimeball i slime, panda sneeze
+stick i crafted, leaves, fishing, witch, deadbush, chest loot#
+string i spider, cave spider, strider, cat, fishing, cat gift, bartering, chest loot#, wg#
+sugar i crafted, witch
+wheat i farming, chest loot#
+wheatseeds i farming, grass, chest loot#, wt trades$, wg#
+
+blaze powder c -> blaze rod
+book c -> paper, leather; chest loot#
+bowl c -> planks; fishing
+brick c -> clayball; trading
+netherbrick c -> netherrack; bartering
+ecrystal c -> ghasttear, glass, eyeofender
+eyeofender c -> blaze powder, epearl
+fspidereye c -> bmushroom, sugar, spidereye
+fireworkstar c -> -
+gmelonslice c -> melonslice, goldngt
+gold c -> ore#; drowned, zombiepig, goldngt, chest loot#
+goldngt c -> gold, ore#; zombiepig, chest loot#
+iron c -> ore#; iron golem, zombie, chest loot#
+netherrite c -> netheritescrap, gold;
+paper c -> reed; chest loot#, villager gift$
+popped cfruit c -> chorusfruit
+
+apple i leaves, trading, chest loot#
+gapple c -> apple, gold; chest loot#
+napple u chest loot#; crafting*
+beetroot i farming
+beetrootsoup c
+bread c
+carrot i farming
+gcarrot c crafting, trading
+chorus fruit iu farming
+cookie c
+dried kelp c
+honeybottle c
+melonslice i melonseeds
+mushroom stew c
+potato i farming
+bakedpotato c
+poisonouspot i farming
+pufferfish i
+pumpkinpie c
+rabbitstew c
+beef i
+steak c
+chicken i
+cookedchicken c
+cod i
+cookedcod c
+mutton i
+cookedmutton c
+porkchop i
+cookedpork c
+rabbit i
+cookedrabbit c
+salmon i
+cookedsalmon c
+rotflesh i
+spidereye i
+suspiciousstew c
+sweetberries iu wg#, chest loot#, wt trades*
+tropicalfish i
+
+dyes i
+
+tools c
+axe
+fishingrod
+flint&steel
+hoe
+pick
+shears
+shovel
+potion
+shield
+milkbucket
+
+info c
+clock
+compass
+map
+book&quill
+
+weapons c
+arrow
+sparrow
+tiparrow
+bow
+xbow
+egg i farming
+snowball i snowlayer
+sword
+trident i drowned
+
+armor c
+boots
+chestplate
+helmet
+horsearmor u/c chest loot#, ?*
+leggings
+
+boat c
+elytra u wg#, endcityinabook*
+minecart c
+
+armorstand c
+bannerpattern u/c u: snout, thing
+bonemeal i
+bottleoenc i
+bucket c
+lava u bastioninabook*, trades*, dripping
+totem i
+
+=======================1.17=======================
+amthystshrd iu wg#, geodeinabook*
+axolotl i
+bundle -
+coppering i drowned, smelting
+glowberries i cavevines
+glowinksac i
+snowbucket i
+raw* u ores
+spyglass c
diff --git a/mobs.txt b/mobs.txt
new file mode 100644
index 0000000..1219b06
--- /dev/null
+++ b/mobs.txt
@@ -0,0 +1,73 @@
+i infinite
+u non-infinite
+n unobtainable in vanilla skyblock
+
+inf:
+bat
+cat
+chicken
+cod
+cow
+donkey
+fox
+horse
+mooshroom
+mule
+ocelot
+parrot
+pig
+puffer
+rabbit
+salmon
+sheep
+skeletonhorse
+snowgolem
+squid
+strider
+tropicalfish
+turtle
+villager (conversion)
+wtrader
+bee
+dolphin
+enderman
+irongolem
+llama
+piglin
+panda
+polarbear
+spider
+wolf
+zombiepig
+blaze
+creeper
+drowned
+endermite
+evoker
+ghast
+guardian
+hoglin
+husk
+magmacube
+phantom
+pillager
+ravager
+skeleton
+slime
+stray
+vex
+vindicator
+witch
+witherskele
+zoglin
+zombie
+zombievillager
+edragon
+wither
+
+unobtainable in skyblock
+cavespider
+elderguardian
+piglinbrute (bastioninabook*)
+shulker (endshipinabook*), renewable after initial obtaining
+silverfish (mod generation*)
diff --git a/pack.mcmeta b/pack.mcmeta
new file mode 100644
index 0000000..e48f174
--- /dev/null
+++ b/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 7,
+ "description": "BearKidsTeam Skyblock 1.17"
+ }
+}
diff --git a/version.txt b/version.txt
new file mode 100644
index 0000000..1623eee
--- /dev/null
+++ b/version.txt
@@ -0,0 +1,2 @@
+revision 7
+2021-07-24