diff --git a/Common/src/generated/resources/.cache/8f7cd5c924d3264b7777ef1696459761f9a70902 b/Common/src/generated/resources/.cache/8f7cd5c924d3264b7777ef1696459761f9a70902 index 8cf64135d8..65cd7f4b28 100644 --- a/Common/src/generated/resources/.cache/8f7cd5c924d3264b7777ef1696459761f9a70902 +++ b/Common/src/generated/resources/.cache/8f7cd5c924d3264b7777ef1696459761f9a70902 @@ -1,4 +1,4 @@ -// 1.20.1 2023-12-24T17:59:13.7584156 Item Models: hexcasting +// 1.20.1 2024-12-10T14:26:44.916295 Item Models: hexcasting 2fc68dcd6d73da3deaa6a33240dd9160a2b79592 assets/hexcasting/models/block/deco/quenched_allay_bricks_0.json d59af7a48b20b210240b26115fb172d6202f9254 assets/hexcasting/models/block/deco/quenched_allay_bricks_1.json a62eeebbca2d145c22f25725bd848ed4d673cefa assets/hexcasting/models/block/deco/quenched_allay_bricks_2.json @@ -19,6 +19,22 @@ f2156b3a7041cf99891b528393db64c6b9ca1a4f assets/hexcasting/models/item/abacus.js 19730853397b109cfedd0c3bbda83d5de6cd15b9 assets/hexcasting/models/item/akashic_record.json 8c735feff09d46d00ed681311f46f61a50cfdc9b assets/hexcasting/models/item/amethyst_dust.json fbb8706993fbc3246c56b9f3eb274ff8968b70f8 assets/hexcasting/models/item/amethyst_pillar.json +533a859174052a332de069b2ffeaf0106d132b9a assets/hexcasting/models/item/ancient_cypher.json +71a7968e43fbb872ee52315a3ee738d0b3fd1a69 assets/hexcasting/models/item/ancient_cypher_0_filled.json +0f0c627d7ed0e8a7e3666ca80ddc13b280d6ce9f assets/hexcasting/models/item/ancient_cypher_1.json +097b8ecfb34df710ca4b396d3a5df7722ecc3596 assets/hexcasting/models/item/ancient_cypher_1_filled.json +9fdde927e7e8b06221aef34a6a6b22d0b790f297 assets/hexcasting/models/item/ancient_cypher_2.json +93257ad393b751931539a5641d4430a4631e95f9 assets/hexcasting/models/item/ancient_cypher_2_filled.json +4af6234e24031ee0989282c8435fe07e85b02771 assets/hexcasting/models/item/ancient_cypher_3.json +41760f3c89d8dc94c515b0ab8220ecf996710a3c assets/hexcasting/models/item/ancient_cypher_3_filled.json +4df83ae775400ca2d480bfb3621abcf58d4d7352 assets/hexcasting/models/item/ancient_cypher_4.json +d21eb7093c0231015808a8b51b27857da1748431 assets/hexcasting/models/item/ancient_cypher_4_filled.json +e2b4e2ac4ad4fa4b490e1774a565a26fb840c474 assets/hexcasting/models/item/ancient_cypher_5.json +4555e5de80047ffa4e72a4a98eb51437a95e7291 assets/hexcasting/models/item/ancient_cypher_5_filled.json +420840b5761fcddbdd10186f3127bc7589badc46 assets/hexcasting/models/item/ancient_cypher_6.json +55c08581a2e8c7134d63b38226bddafff0fba3ae assets/hexcasting/models/item/ancient_cypher_6_filled.json +2731192f0c7a9a8d45ba4fcd8d1de60bade0b49e assets/hexcasting/models/item/ancient_cypher_7.json +7ba3015d79601f1c8238dbac4a45e525e3589f16 assets/hexcasting/models/item/ancient_cypher_7_filled.json 87e7ee44cdd0808a3dd72babfd1db716df2bcdfe assets/hexcasting/models/item/artifact.json 1cd1b4d002d1a9a044ceab7cca842e4a2b7bd2f4 assets/hexcasting/models/item/artifact_0_filled.json 4709e65d8e74cf45b3ba014bdf70373728cccc78 assets/hexcasting/models/item/artifact_1.json diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher.json new file mode 100644 index 0000000000..ffc8b5e1cc --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher.json @@ -0,0 +1,120 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/ancient_cypher", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_0_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_1", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_1_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_2", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 2.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_2_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 2.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_3", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 3.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_3_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 3.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_4", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 4.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_4_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 4.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_5", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 5.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_5_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 5.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_6", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 6.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_6_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 6.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_7", + "predicate": { + "hexcasting:has_patterns": -0.01, + "hexcasting:variant": 7.0 + } + }, + { + "model": "hexcasting:item/ancient_cypher_7_filled", + "predicate": { + "hexcasting:has_patterns": 0.99, + "hexcasting:variant": 7.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/cad/0_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_0_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_0_filled.json new file mode 100644 index 0000000000..b38ad18d6d --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_0_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/0_ancient_cypher", + "layer1": "hexcasting:item/cad/0_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_1.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_1.json new file mode 100644 index 0000000000..e8b7b12d55 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/1_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_1_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_1_filled.json new file mode 100644 index 0000000000..856b0a26d7 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_1_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/1_ancient_cypher", + "layer1": "hexcasting:item/cad/1_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_2.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_2.json new file mode 100644 index 0000000000..3badfcdd0f --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/2_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_2_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_2_filled.json new file mode 100644 index 0000000000..effb9e0198 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_2_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/2_ancient_cypher", + "layer1": "hexcasting:item/cad/2_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_3.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_3.json new file mode 100644 index 0000000000..98aabd91e8 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/3_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_3_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_3_filled.json new file mode 100644 index 0000000000..2f19e9feea --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_3_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/3_ancient_cypher", + "layer1": "hexcasting:item/cad/3_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_4.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_4.json new file mode 100644 index 0000000000..93318f7bc4 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/4_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_4_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_4_filled.json new file mode 100644 index 0000000000..081cfd65c4 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_4_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/4_ancient_cypher", + "layer1": "hexcasting:item/cad/4_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_5.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_5.json new file mode 100644 index 0000000000..9d247cdd23 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/5_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_5_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_5_filled.json new file mode 100644 index 0000000000..0ed6accc2a --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_5_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/5_ancient_cypher", + "layer1": "hexcasting:item/cad/5_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_6.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_6.json new file mode 100644 index 0000000000..bf9c9fe505 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_6.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/6_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_6_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_6_filled.json new file mode 100644 index 0000000000..199292d90f --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_6_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/6_ancient_cypher", + "layer1": "hexcasting:item/cad/6_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_7.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_7.json new file mode 100644 index 0000000000..56e0653080 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_7.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/7_ancient_cypher" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_7_filled.json b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_7_filled.json new file mode 100644 index 0000000000..b408892c14 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/ancient_cypher_7_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cad/7_ancient_cypher", + "layer1": "hexcasting:item/cad/7_ancient_cypher_overlay" + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java index d3eb9455bf..b0dd49eab3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java @@ -3,6 +3,7 @@ import at.petrak.hexcasting.api.casting.SpellList; import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import at.petrak.hexcasting.api.mod.HexConfig; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -131,10 +132,13 @@ public Component display(Tag tag) { out.append(IotaType.getDisplay(csub)); // only add a comma between 2 non-patterns (commas don't look good with Inline patterns) - // TODO: maybe add a config? maybe add a method on IotaType to allow it to opt out of commas - if (i < list.size() - 1 && (IotaType.getTypeFromTag(csub) != PatternIota.TYPE - || IotaType.getTypeFromTag(HexUtils.downcast(list.get(i+1), CompoundTag.TYPE)) != PatternIota.TYPE)) { - out.append(", "); + // TODO: maybe add a method on IotaType to allow it to opt out of commas? + if (i < list.size() - 1) { + var thisIotaNeedsComma = IotaType.getTypeFromTag(csub) != PatternIota.TYPE; + var nextIotaNeedsComma = IotaType.getTypeFromTag(HexUtils.downcast(list.get(i+1), CompoundTag.TYPE)) != PatternIota.TYPE; + var alwaysShowCommas = HexConfig.client().alwaysShowListCommas(); + if (thisIotaNeedsComma || nextIotaNeedsComma || alwaysShowCommas) + out.append(", "); } } return Component.translatable("hexcasting.tooltip.list_contents", out).withStyle(ChatFormatting.DARK_PURPLE); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index 19458cbc8e..50ef99124a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -7,6 +7,7 @@ import net.minecraft.world.item.Tier; import net.minecraft.world.item.Tiers; import net.minecraft.world.level.Level; +import net.minecraft.util.RandomSource; import java.util.List; @@ -49,11 +50,14 @@ public interface ClientConfigAccess { boolean clickingTogglesDrawing(); + boolean alwaysShowListCommas(); + boolean DEFAULT_CTRL_TOGGLES_OFF_STROKE_ORDER = false; boolean DEFAULT_INVERT_SPELLBOOK_SCROLL = false; boolean DEFAULT_INVERT_ABACUS_SCROLL = false; double DEFAULT_GRID_SNAP_THRESHOLD = 0.5; boolean DEFAULT_CLICKING_TOGGLES_DRAWING = false; + boolean DEFAULT_ALWAYS_SHOW_LIST_COMMAS = false; } public interface ServerConfigAccess { @@ -74,10 +78,16 @@ public interface ServerConfigAccess { boolean trueNameHasAmbit(); + double traderScrollChance(); + + List getRandomLootHex(RandomSource rand); + int DEFAULT_MAX_OP_COUNT = 100_000; int DEFAULT_MAX_SPELL_CIRCLE_LENGTH = 1024; int DEFAULT_OP_BREAK_HARVEST_LEVEL = 3; + double DEFAULT_TRADER_SCROLL_CHANCE = 0.4; + boolean DEFAULT_VILLAGERS_DISLIKE_MIND_MURDER = true; List DEFAULT_DIM_TP_DENYLIST = List.of("twilightforest:twilight_forest"); diff --git a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java index 75658fa63a..14ce4e1d22 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java @@ -63,6 +63,7 @@ public static void init() { ItemSpellbook::isSealed); registerVariantOverrides(HexItems.FOCUS, HexItems.FOCUS::getVariant); registerVariantOverrides(HexItems.SPELLBOOK, HexItems.SPELLBOOK::getVariant); + registerVariantOverrides(HexItems.ANCIENT_CYPHER, HexItems.ANCIENT_CYPHER::getVariant); registerVariantOverrides(HexItems.CYPHER, HexItems.CYPHER::getVariant); registerVariantOverrides(HexItems.TRINKET, HexItems.TRINKET::getVariant); registerVariantOverrides(HexItems.ARTIFACT, HexItems.ARTIFACT::getVariant); @@ -75,6 +76,7 @@ public static void init() { } }); + registerPackagedSpellOverrides(HexItems.ANCIENT_CYPHER); registerPackagedSpellOverrides(HexItems.CYPHER); registerPackagedSpellOverrides(HexItems.TRINKET); registerPackagedSpellOverrides(HexItems.ARTIFACT); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt index 2601a70696..c92b1f6d28 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt @@ -17,9 +17,10 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions import net.minecraft.server.level.ServerPlayer import net.minecraft.world.entity.item.ItemEntity import net.minecraft.world.item.ItemStack +import java.util.function.Predicate; // TODO: How to handle in circles -class OpMakePackagedSpell(val itemType: T, val cost: Long) : SpellAction { +class OpMakePackagedSpell(val isValid: Predicate, val expectedType: T, val cost: Long) : SpellAction { override val argc = 2 override fun execute( args: List, @@ -30,13 +31,13 @@ class OpMakePackagedSpell(val itemType: T, val cost: Long) val (handStack) = env.getHeldItemToOperateOn { val hexHolder = IXplatAbstractions.INSTANCE.findHexHolder(it) - it.`is`(itemType) && hexHolder != null && !hexHolder.hasHex() + isValid.test(it) && hexHolder != null && !hexHolder.hasHex() } - ?: throw MishapBadOffhandItem(ItemStack.EMPTY.copy(), itemType.description) // TODO: hack + ?: throw MishapBadOffhandItem(ItemStack.EMPTY.copy(), expectedType.description) // TODO: hack val hexHolder = IXplatAbstractions.INSTANCE.findHexHolder(handStack) - if (!handStack.`is`(itemType)) { - throw MishapBadOffhandItem(handStack, itemType.description) + if (!isValid.test(handStack)) { + throw MishapBadOffhandItem(handStack, expectedType.description) } else if (hexHolder == null || hexHolder.hasHex()) { throw MishapBadOffhandItem.of(handStack, "iota.write") } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java new file mode 100644 index 0000000000..44568c1f8e --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java @@ -0,0 +1,59 @@ +package at.petrak.hexcasting.common.items.magic; + +import at.petrak.hexcasting.api.casting.iota.IotaType; +import at.petrak.hexcasting.api.utils.NBTHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ItemAncientCypher extends ItemCypher { + public static final String TAG_PATTERNS = "patterns"; + public static final String TAG_HEX_NAME = "hex_name"; + + public ItemAncientCypher(Properties pProperties) { + super(pProperties); + } + + @Override + public void clearHex(ItemStack stack) { + super.clearHex(stack); + NBTHelper.remove(stack, TAG_HEX_NAME); + } + + @Override + public Component getName(ItemStack pStack) { + var descID = this.getDescriptionId(pStack); + var hexName = NBTHelper.getString(pStack, TAG_HEX_NAME); + if (hexName != null) { + return Component.translatable(descID + ".preset", Component.translatable(hexName)); + } else { + return Component.translatable(descID); + } + } + + @Override + public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + TooltipFlag pIsAdvanced) { + // display media fullness as usual + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + + // also show contained spell + var patternsTag = NBTHelper.getList(pStack, TAG_PATTERNS, Tag.TAG_COMPOUND); + if (patternsTag != null) { + var storedHex = Component.translatable("hexcasting.tooltip.stored_hex"); + for (var iotaTag : patternsTag) { + var iotaTagC = NBTHelper.getAsCompound(iotaTag); + var iotaComponent = IotaType.getDisplay(iotaTagC).copy(); + storedHex.append(iotaComponent.withStyle(ChatFormatting.DARK_PURPLE)); + } + pTooltipComponents.add(storedHex); + } + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java index 036e5129b4..91a9537355 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java @@ -9,38 +9,45 @@ import at.petrak.hexcasting.common.entities.EntityWallScroll; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; import at.petrak.hexcasting.common.misc.PatternTooltip; +import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; import at.petrak.hexcasting.interop.inline.InlinePatternData; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.Optional; +import java.util.List; import static at.petrak.hexcasting.api.HexAPI.modLoc; /** - * TAG_OP_ID and TAG_PATTERN: "Ancient Scroll of %s" (Great Spells) + * TAG_OP_ID and TAG_PATTERN: "Ancient Scroll of %s" (per-world pattern preloaded) + *
+ * TAG_OP_ID: "Ancient Scroll of %s" (per-world pattern loaded on inv tick) *
* TAG_PATTERN: "Scroll" (custom) *
* (none): "Empty Scroll" - *
- * TAG_OP_ID: invalid */ public class ItemScroll extends Item implements IotaHolderItem { public static final String TAG_OP_ID = "op_id"; public static final String TAG_PATTERN = "pattern"; + public static final String TAG_NEEDS_PURCHASE = "needs_purchase"; public static final ResourceLocation ANCIENT_PREDICATE = modLoc("ancient"); public final int blockSize; @@ -50,6 +57,15 @@ public ItemScroll(Properties pProperties, int blockSize) { this.blockSize = blockSize; } + // this produces a scroll that will load the correct pattern for your world once it ticks + public static ItemStack withPerWorldPattern(ItemStack stack, String op_id) { + Item item = stack.getItem(); + if (item instanceof ItemScroll) + NBTHelper.putString(stack, TAG_OP_ID, op_id); + + return stack; + } + @Override public @Nullable CompoundTag readIotaTag(ItemStack stack) { @@ -133,7 +149,7 @@ public Component getName(ItemStack pStack) { return Component.translatable(descID + ".of", Component.translatable("hexcasting.action." + ResourceLocation.tryParse(ancientId))); } else if (NBTHelper.hasCompound(pStack, TAG_PATTERN)) { - var compound = NBTHelper.getCompound(pStack, ItemScroll.TAG_PATTERN); + var compound = NBTHelper.getCompound(pStack, TAG_PATTERN); var patternLabel = Component.literal(""); if (compound != null) { var pattern = HexPattern.fromNBT(compound); @@ -145,16 +161,39 @@ public Component getName(ItemStack pStack) { } } - // purposely no hover text + @Override + public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pSlotId, boolean pIsSelected) { + // the needs_purchase tag is used so you can't see the pattern on scrolls sold by a wandering trader + // once you put the scroll into your inventory, this removes the tag to reveal the pattern + if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { + NBTHelper.remove(pStack, TAG_NEEDS_PURCHASE); + } + // if op_id is set but there's no stored pattern, load the pattern on inv tick + if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN) && pEntity.getServer() != null) { + AddPerWorldPatternToScrollFunc.doStatic(pStack, pLevel.getRandom(), pEntity.getServer().overworld()); + } + } + + @Override + public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + TooltipFlag pIsAdvanced) { + if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { + var needsPurchase = Component.translatable("hexcasting.tooltip.scroll.needs_purchase"); + pTooltipComponents.add(needsPurchase.withStyle(ChatFormatting.GRAY)); + } else if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN)) { + var notLoaded = Component.translatable("hexcasting.tooltip.scroll.pattern_not_loaded"); + pTooltipComponents.add(notLoaded.withStyle(ChatFormatting.GRAY)); + } + } @Override public Optional getTooltipImage(ItemStack stack) { - var compound = NBTHelper.getCompound(stack, ItemScroll.TAG_PATTERN); - if (compound != null) { + var compound = NBTHelper.getCompound(stack, TAG_PATTERN); + if (compound != null && !NBTHelper.getBoolean(stack, TAG_NEEDS_PURCHASE)) { var pattern = HexPattern.fromNBT(compound); return Optional.of(new PatternTooltip( pattern, - NBTHelper.hasString(stack, ItemScroll.TAG_OP_ID) + NBTHelper.hasString(stack, TAG_OP_ID) ? PatternTooltipComponent.ANCIENT_BG : PatternTooltipComponent.PRISTINE_BG)); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 97e58a75e4..df5792dc52 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -296,14 +296,14 @@ private static T blockNoItem(String name, T block) { return block; } private static T blockItem(String name, T block) { - return blockItem(name, block, HexItems.props(), HexCreativeTabs.HEX); + return blockItem(name, block, HexItems.props(), HexCreativeTabs.MAIN); } private static T blockItem(String name, T block, @Nullable CreativeModeTab tab) { return blockItem(name, block, HexItems.props(), tab); } private static T blockItem(String name, T block, Item.Properties props) { - return blockItem(name, block, props, HexCreativeTabs.HEX); + return blockItem(name, block, props, HexCreativeTabs.MAIN); } private static T blockItem(String name, T block, Item.Properties props, @Nullable CreativeModeTab tab) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java index 93cfd63011..03f171236c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java @@ -4,6 +4,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; +import at.petrak.hexcasting.common.items.storage.ItemScroll; import java.util.LinkedHashMap; import java.util.Map; @@ -20,11 +21,14 @@ public static void registerCreativeTabs(BiConsumer TABS = new LinkedHashMap<>(); - public static final CreativeModeTab HEX = register("hexcasting", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) + public static final CreativeModeTab MAIN = register("main", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) .icon(() -> new ItemStack(HexItems.SPELLBOOK))); + public static final CreativeModeTab SCROLLS = register("scrolls", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) + .icon(() -> ItemScroll.withPerWorldPattern(new ItemStack(HexItems.SCROLL_LARGE),""))); + private static CreativeModeTab register(String name, CreativeModeTab.Builder tabBuilder) { - var tab = tabBuilder.title(Component.translatable("itemGroup." + name)).build(); + var tab = tabBuilder.title(Component.translatable("itemGroup.hexcasting." + name)).build(); var old = TABS.put(modLoc(name), tab); if (old != null) { throw new IllegalArgumentException("Typo? Duplicate id " + name); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index a85889e104..8b4d2e87a8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -1,6 +1,9 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.api.misc.MediaConstants; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.casting.ActionRegistryEntry; +import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.common.items.ItemJewelerHammer; import at.petrak.hexcasting.common.items.ItemLens; import at.petrak.hexcasting.common.items.ItemLoreFragment; @@ -14,6 +17,8 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions; import com.google.common.base.Suppliers; import net.minecraft.Util; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.food.FoodProperties; @@ -35,6 +40,7 @@ public static void registerItems(BiConsumer r) { } public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeModeTab tab) { + if (tab == HexCreativeTabs.SCROLLS) generateScrollEntries(); for (var item : ITEM_TABS.getOrDefault(tab, List.of())) { item.register(r); } @@ -74,6 +80,7 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod public static final ItemFocus FOCUS = make("focus", new ItemFocus(unstackable())); public static final ItemSpellbook SPELLBOOK = make("spellbook", new ItemSpellbook(unstackable())); + public static final ItemCypher ANCIENT_CYPHER = make("ancient_cypher", new ItemAncientCypher(unstackable())); public static final ItemCypher CYPHER = make("cypher", new ItemCypher(unstackable())); public static final ItemTrinket TRINKET = make("trinket", new ItemTrinket(unstackable().rarity(Rarity.UNCOMMON))); public static final ItemArtifact ARTIFACT = make("artifact", new ItemArtifact(unstackable().rarity(Rarity.RARE))); @@ -93,24 +100,23 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod public static final Supplier BATTERY_DUST_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.DUST_UNIT * 64, - MediaConstants.DUST_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.DUST_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_SHARD_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.SHARD_UNIT * 64, - MediaConstants.SHARD_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.SHARD_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_CRYSTAL_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.CRYSTAL_UNIT * 64, - MediaConstants.CRYSTAL_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.CRYSTAL_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_QUENCHED_SHARD_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_SHARD_UNIT * 64, - MediaConstants.QUENCHED_SHARD_UNIT * 64), HexCreativeTabs.HEX); - + MediaConstants.QUENCHED_SHARD_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_QUENCHED_BLOCK_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_BLOCK_UNIT * 64, - MediaConstants.QUENCHED_BLOCK_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.QUENCHED_BLOCK_UNIT * 64), HexCreativeTabs.MAIN); public static final EnumMap DYE_PIGMENTS = Util.make(() -> { var out = new EnumMap(DyeColor.class); @@ -155,6 +161,21 @@ public static Item.Properties unstackable() { return props().stacksTo(1); } + private static void generateScrollEntries() { + var keyList = new ArrayList>(); + Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); + for (var key : regi.registryKeySet()) + if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) + keyList.add(key); + keyList.sort( (a, b) -> a.location().compareTo(b.location()) ); + for (var key : keyList) { + addToTab(() -> ItemScroll.withPerWorldPattern( + new ItemStack(HexItems.SCROLL_LARGE), + key.location().toString() + ),HexCreativeTabs.SCROLLS); + } + } + private static T make(ResourceLocation id, T item, @Nullable CreativeModeTab tab) { var old = ITEMS.put(id, item); if (old != null) { @@ -171,7 +192,7 @@ private static T make(String id, T item, @Nullable CreativeMode } private static T make(String id, T item) { - return make(modLoc(id), item, HexCreativeTabs.HEX); + return make(modLoc(id), item, HexCreativeTabs.MAIN); } private static Supplier addToTab(Supplier stack, CreativeModeTab tab) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java index bebc94ad42..409f5c979c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; +import at.petrak.hexcasting.common.loot.AddHexToAncientCypherFunc; import at.petrak.hexcasting.common.loot.AmethystReducerFunc; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType; @@ -22,6 +23,8 @@ public static void registerSerializers(BiConsumer(HexItems.CYPHER, - MediaConstants.CRYSTAL_UNIT) + HexPattern.fromAngles("waqqqqq", HexDir.EAST), new OpMakePackagedSpell<>(s -> (s.is(HexItems.CYPHER)||s.is(HexItems.ANCIENT_CYPHER)), + HexItems.CYPHER, MediaConstants.CRYSTAL_UNIT) )); public static final ActionRegistryEntry CRAFT$TRINKET = make("craft/trinket", new ActionRegistryEntry( HexPattern.fromAngles( - "wwaqqqqqeaqeaeqqqeaeq", HexDir.EAST), new OpMakePackagedSpell<>(HexItems.TRINKET, - 5 * MediaConstants.CRYSTAL_UNIT))); + "wwaqqqqqeaqeaeqqqeaeq", HexDir.EAST), new OpMakePackagedSpell<>(s -> s.is(HexItems.TRINKET), + HexItems.TRINKET, 5 * MediaConstants.CRYSTAL_UNIT))); public static final ActionRegistryEntry CRAFT$ARTIFACT = make("craft/artifact", new ActionRegistryEntry( HexPattern.fromAngles("wwaqqqqqeawqwqwqwqwqwwqqeadaeqqeqqeadaeqq", HexDir.EAST), - new OpMakePackagedSpell<>(HexItems.ARTIFACT, 10 * MediaConstants.CRYSTAL_UNIT) + new OpMakePackagedSpell<>(s -> s.is(HexItems.ARTIFACT), HexItems.ARTIFACT, 10 * MediaConstants.CRYSTAL_UNIT) )); public static final ActionRegistryEntry CRAFT$BATTERY = make("craft/battery", new ActionRegistryEntry( HexPattern.fromAngles("aqqqaqwwaqqqqqeqaqqqawwqwqwqwqwqw", HexDir.SOUTH_WEST), OpMakeBattery.INSTANCE)); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java new file mode 100644 index 0000000000..3055d1020e --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java @@ -0,0 +1,84 @@ +package at.petrak.hexcasting.common.loot; + +import at.petrak.hexcasting.api.casting.iota.PatternIota; +import at.petrak.hexcasting.api.casting.iota.IotaType; +import at.petrak.hexcasting.api.casting.math.HexDir; +import at.petrak.hexcasting.api.casting.math.HexPattern; +import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.item.VariantItem; +import at.petrak.hexcasting.api.misc.MediaConstants; +import at.petrak.hexcasting.common.items.magic.ItemAncientCypher; +import at.petrak.hexcasting.common.lib.HexLootFunctions; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import net.minecraft.util.RandomSource; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction; +import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; + +import java.util.ArrayList; + +/** + * Add a random preset hex to the ancient cypher, and select a random variant. + *

+ * The function itself is only used on Fabric but the behavior {@link AddHexToAncientCypherFunc#doStatic} + * is used on both sides + */ +public class AddHexToAncientCypherFunc extends LootItemConditionalFunction { + public AddHexToAncientCypherFunc(LootItemCondition[] lootItemConditions) { + super(lootItemConditions); + } + + /** + * This doesn't actually have any params so extract behaviour out for the benefit of forge + */ + public static ItemStack doStatic(ItemStack stack, RandomSource rand) { + var fullHex = HexConfig.server().getRandomLootHex(rand); + var patsTag = new ListTag(); + // skip first element since it's the name, not a pattern + for (var patString : fullHex.subList(1,fullHex.size())){ + var pieces = patString.split(" "); + var pat = HexPattern.fromAngles(pieces[1],HexDir.fromString(pieces[0])); + patsTag.add(IotaType.serialize(new PatternIota(pat))); + } + + var tag = new CompoundTag(); + tag.putString(ItemAncientCypher.TAG_HEX_NAME, fullHex.get(0)); + tag.putLong(ItemAncientCypher.TAG_MEDIA, 32*MediaConstants.SHARD_UNIT); + tag.putLong(ItemAncientCypher.TAG_MAX_MEDIA, 32*MediaConstants.SHARD_UNIT); + tag.putInt(VariantItem.TAG_VARIANT, rand.nextInt(8)); + tag.put(ItemAncientCypher.TAG_PATTERNS, patsTag); + stack.getOrCreateTag().merge(tag); + + return stack; + } + + @Override + protected ItemStack run(ItemStack stack, LootContext ctx) { + return doStatic(stack, ctx.getRandom()); + } + + @Override + public LootItemFunctionType getType() { + return HexLootFunctions.HEX_CYPHER; + } + + public static class Serializer extends LootItemConditionalFunction.Serializer { + @Override + public void serialize(JsonObject json, AddHexToAncientCypherFunc value, JsonSerializationContext ctx) { + super.serialize(json, value, ctx); + } + + @Override + public AddHexToAncientCypherFunc deserialize(JsonObject object, JsonDeserializationContext ctx, + LootItemCondition[] conditions) { + return new AddHexToAncientCypherFunc(conditions); + } + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java index 30c9f97370..1a972bc022 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java @@ -3,6 +3,7 @@ import at.petrak.hexcasting.api.casting.ActionRegistryEntry; import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.utils.NBTHelper; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; import at.petrak.hexcasting.common.items.storage.ItemScroll; import at.petrak.hexcasting.common.lib.HexLootFunctions; @@ -10,9 +11,12 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; +import net.minecraft.util.RandomSource; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction; @@ -35,30 +39,32 @@ public AddPerWorldPatternToScrollFunc(LootItemCondition[] lootItemConditions) { /** * This doesn't actually have any params so extract behaviour out for the benefit of forge */ - public static ItemStack doStatic(ItemStack stack, LootContext ctx) { - var rand = ctx.getRandom(); - var perWorldKeys = new ArrayList>(); - Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); - for (var key : regi.registryKeySet()) { - if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) { - perWorldKeys.add(key); + public static ItemStack doStatic(ItemStack stack, RandomSource rand, ServerLevel overworld) { + ResourceKey patternKey; + if (NBTHelper.hasString(stack, ItemScroll.TAG_OP_ID)) { + patternKey = ResourceKey.create( + IXplatAbstractions.INSTANCE.getActionRegistry().key(), + ResourceLocation.tryParse(NBTHelper.getString(stack, ItemScroll.TAG_OP_ID)) + ); + } else { + var perWorldKeys = new ArrayList>(); + Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); + for (var key : regi.registryKeySet()) { + if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) { + perWorldKeys.add(key); + } } + patternKey = perWorldKeys.get(rand.nextInt(perWorldKeys.size())); + NBTHelper.putString(stack, ItemScroll.TAG_OP_ID, patternKey.location().toString()); } - var key = perWorldKeys.get(rand.nextInt(perWorldKeys.size())); - - var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(key, ctx.getLevel().getServer().overworld()); - var tag = new CompoundTag(); - tag.putString(ItemScroll.TAG_OP_ID, key.location().toString()); - tag.put(ItemScroll.TAG_PATTERN, pat.serializeToNBT()); - - stack.getOrCreateTag().merge(tag); - + var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(patternKey, overworld); + NBTHelper.put(stack, ItemScroll.TAG_PATTERN, pat.serializeToNBT()); return stack; } @Override protected ItemStack run(ItemStack stack, LootContext ctx) { - return doStatic(stack, ctx); + return doStatic(stack, ctx.getRandom(), ctx.getLevel().getServer().overworld()); } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java index e0788d5446..19784afb75 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java @@ -4,16 +4,18 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; +import java.util.List; + import static at.petrak.hexcasting.api.HexAPI.modLoc; // https://github.com/VazkiiMods/Botania/blob/1.18.x/Xplat/src/main/java/vazkii/botania/common/loot/LootHandler.java // We need to inject dungeon loot (scrolls and lore), make amethyst drop fewer shards, and the extra dust stuff. // On forge: -// - Scrolls and lore are done with a loot mod +// - Scrolls, lore, and cyphers are done with a loot mod // - Amethyst drop fiddling is done with another loot mod; the shard delta is in the loot mod data and the rest of // the stuff is loaded from TABLE_INJECT_AMETHYST_CLUSTER // On fabric: -// - Scrolls and lore are done with a lootLoad listener and the amounts are loaded from config +// - Scrolls, lore, and cyphers are done with a lootLoad listener and the amounts are loaded from config // - Amethyst shard reduction is done with a loot function mixed in to always be on amethyst clusters, god, cause I // don't think it's facile to use the loot pool api to try to figure out which pool is for the amethyst and reduce it // - Amethyst dust and crystals are done by adding the loot table Forge uses in directly via listener @@ -45,6 +47,8 @@ public class HexLootHandler { // if you manage to find one of these things you deserve a lot of scrolls new ScrollInjection(new ResourceLocation("minecraft", "chests/woodland_mansion"), 5), new ScrollInjection(new ResourceLocation("minecraft", "chests/stronghold_library"), 5) + + // you can use the table hexcasting:random_scroll to get exactly 1 scroll and nothing else ); public static final ImmutableList DEFAULT_LORE_INJECTS = ImmutableList.of( @@ -61,12 +65,43 @@ public class HexLootHandler { new ResourceLocation("minecraft", "chests/village/village_taiga_house") ); + public static final ImmutableList DEFAULT_CYPHER_INJECTS = ImmutableList.of( + new ResourceLocation("minecraft", "chests/simple_dungeon"), + new ResourceLocation("minecraft", "chests/abandoned_mineshaft"), + new ResourceLocation("minecraft", "chests/stronghold_corridor"), + new ResourceLocation("minecraft", "chests/jungle_temple"), + new ResourceLocation("minecraft", "chests/desert_pyramid"), + new ResourceLocation("minecraft", "chests/ancient_city"), + new ResourceLocation("minecraft", "chests/nether_bridge") + // you can use the table hexcasting:random_cypher to get exactly 1 cypher and nothing else + ); + + public static final ImmutableList> DEFAULT_LOOT_HEXES = ImmutableList.of( + List.of("hexcasting.loot_hex.shatter","NORTH_EAST qaq","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST wqaawdd","EAST qaqqqqq"), + List.of("hexcasting.loot_hex.kindle","NORTH_EAST qaq","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST wqaawdd","SOUTH_EAST aaqawawa"), + List.of("hexcasting.loot_hex.illuminate","NORTH_EAST qaq","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST aadadaaw","EAST wqaawdd","NORTH_EAST ddqdd","EAST weddwaa","NORTH_EAST waaw","NORTH_EAST qqd"), + List.of("hexcasting.loot_hex.growth","NORTH_EAST qaq","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST aadadaaw","EAST wqaawdd","NORTH_EAST ddqdd","EAST weddwaa","NORTH_EAST waaw","SOUTH_EAST aqaaedwd","EAST aadaadaa","NORTH_EAST wqaqwawqaqw","NORTH_EAST wqaqwawqaqw","NORTH_EAST wqaqwawqaqw"), + List.of("hexcasting.loot_hex.lunge","NORTH_EAST qaq","EAST aadaa","NORTH_EAST wa","SOUTH_EAST aqaawa","SOUTH_EAST waqaw","SOUTH_WEST awqqqwaqw"), + List.of("hexcasting.loot_hex.sidestep","NORTH_EAST qaq","EAST aadaa","NORTH_EAST wa","NORTH_WEST eqqq","SOUTH_EAST aqaawd","SOUTH_EAST e","NORTH_WEST qqqqqew","SOUTH_WEST eeeeeqw","SOUTH_EAST awdd","NORTH_EAST wdedw","SOUTH_WEST awqqqwaqw"), + List.of("hexcasting.loot_hex.ascend","NORTH_EAST qaq","SOUTH_EAST aqaae","WEST qqqqqawwawawd"), + List.of("hexcasting.loot_hex.blink","NORTH_EAST qaq","EAST aadaa","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST wqaawdd","NORTH_EAST qaq","EAST aa","NORTH_WEST wddw","NORTH_EAST wqaqw","SOUTH_EAST aqaaw","NORTH_WEST wddw","SOUTH_WEST awqqqwaq"), + List.of("hexcasting.loot_hex.blastoff","NORTH_EAST qaq","NORTH_WEST qqqqqew","SOUTH_EAST aqaawaa","SOUTH_EAST waqaw","SOUTH_WEST awqqqwaqw"), + List.of("hexcasting.loot_hex.radar","WEST qqq","EAST aadaa","EAST aa","SOUTH_EAST aqaawa","SOUTH_WEST ewdqdwe","NORTH_EAST de","EAST eee","NORTH_EAST qaq","EAST aa","SOUTH_EAST aqaaeaqq","SOUTH_EAST qqqqqwdeddwd","NORTH_EAST dadad"), + List.of("hexcasting.loot_hex.beckon","NORTH_EAST qaq","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST weaqa","EAST aadaa","EAST dd","NORTH_EAST qaq","EAST aa","EAST aawdd","NORTH_WEST wddw","EAST aadaa","NORTH_EAST wqaqw","NORTH_EAST wdedw","SOUTH_EAST aqaawa","SOUTH_EAST waqaw","SOUTH_WEST awqqqwaqw"), + List.of("hexcasting.loot_hex.detonate","NORTH_EAST qaq","EAST aa","SOUTH_EAST aqaaedwd","EAST ddwddwdd"), + List.of("hexcasting.loot_hex.shockwave","NORTH_EAST qaq","EAST aa","SOUTH_EAST aqaawaa","EAST aadaadaa","SOUTH_EAST aqawqadaq","SOUTH_EAST aqaaedwd","EAST aawaawaa","NORTH_EAST qqa","EAST qaqqqqq"), + List.of("hexcasting.loot_hex.heat_wave","WEST qqq","SOUTH_EAST aaqawawa","EAST eee","NORTH_EAST qaq","EAST aa","SOUTH_EAST aqaae","SOUTH_EAST qqqqqwded","SOUTH_WEST aaqwqaa","SOUTH_EAST a","NORTH_EAST dadad"), + List.of("hexcasting.loot_hex.wither_wave","WEST qqq","SOUTH_EAST aqaae","SOUTH_EAST aqaaw","SOUTH_WEST qqqqqaewawawe","EAST eee","NORTH_EAST qaq","EAST aa","SOUTH_EAST aqaae","SOUTH_EAST qqqqqwdeddwd","SOUTH_WEST aaqwqaa","SOUTH_EAST a","NORTH_EAST dadad"), + List.of("hexcasting.loot_hex.flight_zone","NORTH_EAST qaq","SOUTH_EAST aqaaq","SOUTH_WEST awawaawq") + ); + public static int getScrollCount(int range, RandomSource random) { return Math.max(random.nextIntBetweenInclusive(-range, range), 0); } public static final double DEFAULT_SHARD_MODIFICATION = -0.5; public static final double DEFAULT_LORE_CHANCE = 0.4; + public static final double DEFAULT_CYPHER_CHANCE = 0.4; public static final ResourceLocation TABLE_INJECT_AMETHYST_CLUSTER = modLoc("inject/amethyst_cluster"); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java new file mode 100644 index 0000000000..6972090d55 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java @@ -0,0 +1,37 @@ +package at.petrak.hexcasting.mixin; + +import net.minecraft.world.entity.npc.WanderingTrader; +import net.minecraft.world.item.trading.MerchantOffers; +import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.util.RandomSource; +import net.minecraft.server.MinecraftServer; +import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.api.utils.NBTHelper; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; +import at.petrak.hexcasting.common.items.storage.ItemScroll; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// Adds ancient scrolls to the wandering trader by replacing one of the 5 junk trades +@Mixin(WanderingTrader.class) +public class MixinWanderingTrader { + @Inject(method = "updateTrades", at = @At("RETURN")) + private void addNewTrades(CallbackInfo ci) { + var self = (WanderingTrader) (Object) this; + MerchantOffers offerList = self.getOffers(); + if (offerList == null) + return; + RandomSource rand = self.getRandom(); + if (rand.nextFloat() < HexConfig.server().traderScrollChance() && self.getServer() != null) { + ItemStack scroll = new ItemStack(HexItems.SCROLL_LARGE); + AddPerWorldPatternToScrollFunc.doStatic(scroll, rand, self.getServer().overworld()); + NBTHelper.putBoolean(scroll, ItemScroll.TAG_NEEDS_PURCHASE, true); + offerList.set(rand.nextInt(5), new MerchantOffer(new ItemStack(Items.EMERALD, 12), scroll, 1, 1, 1)); + } + } +} diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 2eb861e346..21fb7cac8c 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -46,6 +46,11 @@ "": "Focus", sealed: "Sealed Focus", }, + + ancient_cypher: { + "": "Ancient Cypher", + preset: "Ancient Cypher: %s", + }, thought_knot: "Thought-Knot", spellbook: "Spellbook", @@ -252,8 +257,8 @@ }, "itemGroup.hexcasting": { - "": "Hexcasting", - creative_tab: "Hexcasting", + main: "Hex Casting", + scrolls: "Hex Casting (Scrolls)", }, "gui.hexcasting": { @@ -345,6 +350,10 @@ "": "Clicking Toggles Drawing", "@Tooltip": "Whether you click to start and stop drawing instead of clicking and dragging to draw", }, + alwaysShowListCommas: { + "": "Always Show List Commas", + "@Tooltip": "Whether all iota types should be comma-separated when displayed in lists (by default, pattern iotas do not use commas)", + }, }, server: { @@ -372,19 +381,38 @@ "": "Villagers Offended By Mind Murder", "@Tooltip": "Whether villagers should be angry at the player when other villagers are mindflayed", }, + traderScrollChance: { + "": "Wandering Trader Scroll Chance", + "@Tooltip": "The chance for wandering traders to sell an Ancient Scroll", + }, scrollInjectionsRaw: { "": "Scroll Injection Weights", "@Tooltip": "Maps the names of loot tables to the amount of per-world patterns on scrolls should go in them. There's about a 50% chance to get any scrolls in a given chest marked here; once that is met, between 1 and that many scrolls are generated.", }, + loreInjectionsRaw: { + "": "Lore Injection Sites", + "@Tooltip": "Lists the loot tables that lore fragments should be added to.", + }, + loreChance: { + "": "Lore Fragment Chance", + "@Tooltip": "The chance for lore fragments to appear in any of the above loot tables.", + }, + cypherInjectionsRaw: { + "": "Ancient Cypher Injection Sites", + "@Tooltip": "Lists the loot tables that ancient cyphers should be added to.", + }, + cypherChance: { + "": "Ancient Cypher Chance", + "@Tooltip": "The chance for ancient cyphers to appear in any of the above loot tables.", + }, + lootHexList: { + "": "Preset Loot Hex List", + "@Tooltip": "Lists the preset hexes that can be found in ancient cyphers. The first item in each list is the name of the hex, and the others are the patterns. The name is treated as a translation key if possible, but if you add your own they should be human-readable.", + }, amethystShardModification: { "": "Amethyst Shard Drop Rate Change", "@Tooltip": "How much the number of amethyst shards dropped from clusters is increased/decreased.", }, - - // TODO: are these used anywhere?? - "fewScrollTables.@Tooltip": "Loot tables that a small number of Ancient Scrolls are injected into", - "someScrollTables.@Tooltip": "Loot tables that a decent number of Ancient Scrolls are injected into", - "manyScrollTables.@Tooltip": "Loot tables that a huge number of Ancient Scrolls are injected into", }, }, }, @@ -499,6 +527,25 @@ infinite_media: "Infinite", }, + loot_hex: { + "shatter": "Shatter", + "kindle": "Kindle", + "illuminate": "Illuminate", + "growth": "Growth", + "lunge": "Lunge", + "sidestep": "Sidestep", + "ascend": "Ascend", + "blink": "Blink", + "blastoff": "Blastoff", + "radar": "Radar", + "beckon": "Beckon", + "detonate": "Detonate", + "shockwave": "Shockwave", + "heat_wave": "Heat Wave", + "wither_wave": "Wither Wave", + "flight_zone": "Flight Zone", + }, + // TODO: post-eigengrau make these less anticlimactic message: { cant_overcast: "That Hex needed more media than I had... I should double-check my math.", @@ -521,6 +568,11 @@ }, sealed: "Sealed", }, + + scroll: { + needs_purchase: "Purchase to show pattern", + pattern_not_loaded: "Place in inventory to load pattern", + }, abacus: { "": "%d", @@ -562,6 +614,7 @@ media: "%d dust", media_amount: "Contains: %s (%s)", "media_amount.advanced": "Contains: %s/%s (%s)", + stored_hex: "Hex: ", list_contents: "[%s]", null_iota: "Null", @@ -1159,6 +1212,7 @@ // why is this called "hexcasting"? hexcasting: "Casting Items", + ancient_cyphers: "Ancient Cyphers", phials: "Phials of Media", potions: "Hex Potions", pigments: "Pigments", @@ -1475,7 +1529,7 @@ "2": "Like a $(l:items/focus)$(item)Focus/$, there exists a simple method to prevent accidental overwriting. Crafting it with a $(item)Honeycomb/$ will lacquer the current page, preventing $(l:patterns/readwrite#hexcasting:write)$(action)Scribe's Gambit/$ from modifying its contents. Also like a $(l:items/focus)$(item)Focus/$, using $(l:patterns/spells/hexcasting#hexcasting:erase)$(action)Erase Item/$ will remove the lacquer along with the page's contents.$(br2)I can also name each page individually in an anvil. Naming it will change only the name of the currently selected page, for easy browsing.", "crafting.desc": "$(italic)Wizards love words. Most of them read a great deal, and indeed one strong sign of a potential wizard is the inability to get to sleep without reading something first.", }, - + scroll: { "1": "A $(l:items/scroll)$(item)Scroll/$ is a convenient method of sharing a pattern with others. I can copy a pattern onto one with $(l:patterns/readwrite#hexcasting:write)$(action)Scribe's Gambit/$, after which it will display in a tooltip.$(br2)I can also place them on the wall as decoration or edification, like a painting, in sizes from 1x1 to 3x3 blocks. Using $(l:items/amethyst)$(item)Amethyst Dust/$ on such a scroll will have it display the stroke order.", "2": "In addition, I can also find so-called $(l:items/scroll)$(item)Ancient Scrolls/$ in the dungeons and strongholds of the world. These contain the stroke order of $(thing)Great Spells/$, powerful magicks rumored to be too powerful for the hands and minds of mortals...$(br2)If those \"mortals\" couldn't cast them, I'm not sure they deserve to know them.", @@ -1498,6 +1552,11 @@ "5": "Each infusion spell requires an entity and a list of patterns on the stack. The entity must be a _media-holding item entity (i.e. $(l:items/amethyst)$(item)amethyst/$ crystals, dropped on the ground); the entity is consumed and forms the battery.$(br2)Usefully, it seems that the _media in the battery is not consumed in chunks as it is when casting with a $(l:items/staff)$(item)Staff/$-- rather, the _media \"melts down\" into one continuous pool. Thus, if I store a _Hex that only costs one $(l:items/amethyst)$(item)Amethyst Dust/$'s worth of media, a $(l:items/amethyst)$(item)Charged Crystal/$ used as the battery will allow me to cast it 10 times.", "crafting.desc": "$(italic)We have a saying in our field: \"Magic isn't\". It doesn't \"just work,\" it doesn't respond to your thoughts, you can't throw fireballs or create a roast dinner from thin air or turn a bunch of muggers into frogs and snails./$", }, + + ancient_cyphers: { + "1": "While adventuring, I've come across what appear to be $(l:items/hexcasting)$(item)Cyphers/$ created by the Hexcasters of the ancient past. These $(item)Ancient Cyphers/$ work just like the ones I can craft: they can't be recharged, and will break when their reserve of _Media runs out. However, unlike my own $(l:items/hexcasting)$(item)Cyphers/$, their decayed structure allows me to glimpse the _Hex stored within.", + "2": "These may be useful for learning new techniques - who better to teach me than ancient masters of the art?$(br2)Alternatively, I could erase the contents of one and store my own _Hex inside, creating a casting item that clearly displays its own function." + }, phials: { "1": "I find it quite ... irritating, how Nature refuses to give me change for my work. If all I have on hand is $(l:items/amethyst)$(item)Charged Amethyst/$, even the tiniest $(l:patterns/basics#hexcasting:raycast)$(action)Archer's Distillation/$ will consume the entire crystal, wasting the remaining _media.$(br2)Fortunately, it seems I've found a way to somewhat allay this problem.", diff --git a/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 index 1b94caa75f..34d8f54885 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 @@ -335,11 +335,6 @@ "": "Amethyst Shard Drop Rate Change", "@Tooltip": "How much the number of amethyst shards dropped from clusters is increased/decreased.", }, - - // TODO: are these used anywhere?? - "fewScrollTables.@Tooltip": "Loot tables that a small number of Ancient Scrolls are injected into", - "someScrollTables.@Tooltip": "Loot tables that a decent number of Ancient Scrolls are injected into", - "manyScrollTables.@Tooltip": "Loot tables that a huge number of Ancient Scrolls are injected into", }, }, }, diff --git a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 index 7715983dec..d49fa95d3c 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 @@ -380,11 +380,6 @@ "": "紫水晶碎片掉落率变化量", "@Tooltip": "采掘紫水晶簇时紫水晶碎片掉落数量相较原版的改变量", }, - - // TODO: are these used anywhere?? - "option.server.fewScrollTables.@Tooltip": "会额外生成较少数量卷轴的战利品表", - "option.server.someScrollTables.@Tooltip": "会额外生成中等数量卷轴的战利品表", - "option.server.manyScrollTables.@Tooltip": "会额外生成较大数量卷轴的战利品表", }, }, }, diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json new file mode 100644 index 0000000000..e3fc78bda9 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json @@ -0,0 +1,18 @@ +{ + "name": "hexcasting.entry.ancient_cyphers", + "category": "hexcasting:items", + "icon": "hexcasting:ancient_cypher", + "sortnum": 7, + "advancement": "hexcasting:root", + "pages": [ + { + "type": "patchouli:text", + "text": "hexcasting.page.ancient_cyphers.1" + }, + { + "type": "patchouli:spotlight", + "text": "hexcasting.page.ancient_cyphers.2", + "item": "hexcasting:ancient_cypher{variant:0},hexcasting:ancient_cypher{variant:1},hexcasting:ancient_cypher{variant:2},hexcasting:ancient_cypher{variant:3},hexcasting:ancient_cypher{variant:4},hexcasting:ancient_cypher{variant:5},hexcasting:ancient_cypher{variant:6},hexcasting:ancient_cypher{variant:7}" + } + ] + } \ No newline at end of file diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/0_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/0_ancient_cypher.png new file mode 100644 index 0000000000..844e9eca1d Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/0_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/0_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/0_ancient_cypher_overlay.png new file mode 100644 index 0000000000..95df139be8 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/0_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/1_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/1_ancient_cypher.png new file mode 100644 index 0000000000..ac4ca4c8bb Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/1_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/1_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/1_ancient_cypher_overlay.png new file mode 100644 index 0000000000..9cecaa2933 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/1_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/2_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/2_ancient_cypher.png new file mode 100644 index 0000000000..7fc5a246f5 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/2_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/2_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/2_ancient_cypher_overlay.png new file mode 100644 index 0000000000..f0ea5738a5 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/2_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/3_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/3_ancient_cypher.png new file mode 100644 index 0000000000..3aae1ef12b Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/3_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/3_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/3_ancient_cypher_overlay.png new file mode 100644 index 0000000000..911afbadde Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/3_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/4_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/4_ancient_cypher.png new file mode 100644 index 0000000000..e52c0d34d4 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/4_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/4_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/4_ancient_cypher_overlay.png new file mode 100644 index 0000000000..e5a60b5f0c Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/4_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/5_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/5_ancient_cypher.png new file mode 100644 index 0000000000..a17fcfc223 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/5_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/5_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/5_ancient_cypher_overlay.png new file mode 100644 index 0000000000..2847ac3bdc Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/5_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/6_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/6_ancient_cypher.png new file mode 100644 index 0000000000..509b48f17d Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/6_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/6_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/6_ancient_cypher_overlay.png new file mode 100644 index 0000000000..dab10d51a5 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/6_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/7_ancient_cypher.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/7_ancient_cypher.png new file mode 100644 index 0000000000..77f72ab422 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/7_ancient_cypher.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/cad/7_ancient_cypher_overlay.png b/Common/src/main/resources/assets/hexcasting/textures/item/cad/7_ancient_cypher_overlay.png new file mode 100644 index 0000000000..ac56ac22cf Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/cad/7_ancient_cypher_overlay.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_large.png b/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_large.png index b81f651b73..04bc429df4 100644 Binary files a/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_large.png and b/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_large.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_medium.png b/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_medium.png index 58adf2fc4d..90f4877fa5 100644 Binary files a/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_medium.png and b/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_medium.png differ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_small.png b/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_small.png index 88a87a7720..aabd00acae 100644 Binary files a/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_small.png and b/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_small.png differ diff --git a/Common/src/main/resources/data/hexcasting/loot_tables/random_cypher.json b/Common/src/main/resources/data/hexcasting/loot_tables/random_cypher.json new file mode 100644 index 0000000000..ea2aebc786 --- /dev/null +++ b/Common/src/main/resources/data/hexcasting/loot_tables/random_cypher.json @@ -0,0 +1,3 @@ +{ + "pools": [] +} \ No newline at end of file diff --git a/Common/src/main/resources/data/hexcasting/loot_tables/random_scroll.json b/Common/src/main/resources/data/hexcasting/loot_tables/random_scroll.json new file mode 100644 index 0000000000..ea2aebc786 --- /dev/null +++ b/Common/src/main/resources/data/hexcasting/loot_tables/random_scroll.json @@ -0,0 +1,3 @@ +{ + "pools": [] +} \ No newline at end of file diff --git a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json index 146a1d2642..b99fbc81ce 100644 --- a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json +++ b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json @@ -4,7 +4,7 @@ "version": 1, "show_progress": false, "nameplate_color": "00072b", - "creative_tab": "hexcasting:hexcasting", + "creative_tab": "hexcasting:main", "model": "hexcasting:patchouli_book", "book_texture": "hexcasting:textures/gui/patchi_book.png", "filler_texture": "hexcasting:textures/gui/patchi_filler.png", diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index 1d2ac13000..a70b99261b 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -9,6 +9,7 @@ "MixinMob", "MixinRaider", "MixinVillager", + "MixinWanderingTrader", "MixinWitch", "accessor.AccessorAbstractArrow", "accessor.AccessorEntity", diff --git a/Fabric/src/generated/resources/.cache/19f2b40f78e342d65a8cb499a41e3fcb2eadaca3 b/Fabric/src/generated/resources/.cache/19f2b40f78e342d65a8cb499a41e3fcb2eadaca3 index 6b6009aeea..a81ebceb63 100644 --- a/Fabric/src/generated/resources/.cache/19f2b40f78e342d65a8cb499a41e3fcb2eadaca3 +++ b/Fabric/src/generated/resources/.cache/19f2b40f78e342d65a8cb499a41e3fcb2eadaca3 @@ -1,58 +1,58 @@ -// 1.20.1 2024-11-19T11:30:28.198417333 Hex Casting/Loot Tables -1dd4268edf7d6fa247013ab45541c7bfb915eef8 data/hexcasting/loot_tables/blocks/amethyst_bricks_small.json -601384d888edab27efe4a33027bb557eb7cb6ca2 data/hexcasting/loot_tables/blocks/edified_log_purple.json -2c9af74a82ca462e5986354966d5a0a1fd5a2083 data/hexcasting/loot_tables/blocks/slate_tiles.json -7c9c94d5b6b570d25eff32d4fa2ecc1e842e5231 data/hexcasting/loot_tables/blocks/quenched_allay_tiles.json -ecaeb4d5703a7aa206627ed38ee71aeb7e93d688 data/hexcasting/loot_tables/blocks/impetus/rightclick.json -a4e0194d8966a24531e43e04437cdb2a96456898 data/hexcasting/loot_tables/blocks/edified_tile.json -847bc3ead8a88a8f210a24e7732c28d50aa2f5dc data/hexcasting/loot_tables/blocks/edified_planks.json -92331eb19422730ffda0a3e52427a75aa1f7aff2 data/hexcasting/loot_tables/blocks/ancient_scroll_paper_lantern.json -4efd95d408d050c36ff21b18f3c37116491fef92 data/hexcasting/loot_tables/blocks/directrix/redstone.json -8c6c0486170537d73b923a2b9f83722107fc8716 data/hexcasting/loot_tables/blocks/edified_log_aventurine.json -ab86e126a704550d3f21c0b43f99fdc2665e4b09 data/hexcasting/loot_tables/blocks/slate_amethyst_tiles.json -7123b1a0469d7bd5bf8a2772182d222bf354df1a data/hexcasting/loot_tables/blocks/slate_bricks_small.json -b6c23fdde4f2c22c81f008604d5ff1c32ca8eb61 data/hexcasting/loot_tables/blocks/amethyst_tiles.json -b706c8a064f717c57104c48ea42aa860b45cf7a4 data/hexcasting/loot_tables/blocks/amethyst_dust_block.json -6eecc98b606d7ea5ec6f4c1fa4f63f7c1eba9223 data/hexcasting/loot_tables/blocks/slate_amethyst_bricks.json -b19ac49146149555038e6d2e06200d514df1ef43 data/hexcasting/loot_tables/blocks/akashic_bookshelf.json -9ff760d5db5628328ea9274c98e18a08f1ab983e data/hexcasting/loot_tables/blocks/slate_block.json -2ab674e834184b4e17dc002556d4473cac137445 data/hexcasting/loot_tables/blocks/edified_slab.json -df5496da8e48b61a171bc7a3936495c016cc002e data/hexcasting/loot_tables/blocks/directrix/empty.json -49940d1cb2599212e2837d7ed66c6c66e54f80f8 data/hexcasting/loot_tables/blocks/akashic_record.json -c81a5cb81141ab1fe09dd5dd3a0968b69dfffbd7 data/hexcasting/loot_tables/blocks/stripped_edified_log.json -10cb1b94596ac7131efe3bd5c36c1543ddba9302 data/hexcasting/loot_tables/blocks/impetus/redstone.json -499af9f15cf0a7f16fd2939e5d3af60a8089cc3e data/hexcasting/loot_tables/blocks/slate_bricks.json -147e0739a712a9050856cebcad1757b3f418f647 data/hexcasting/loot_tables/blocks/edified_trapdoor.json -2ad288784b0dc106ace2e6e0a40669f83476c414 data/hexcasting/loot_tables/blocks/slate.json -6c35afda4ca349f3506fe08f86f0afe58a6f2c44 data/hexcasting/loot_tables/blocks/quenched_allay.json -e6ff979aa47877c1b807075c448defd249cd3484 data/hexcasting/loot_tables/blocks/slate_amethyst_pillar.json -55f265961463a89c243ec8ac1970c70185f064a6 data/hexcasting/loot_tables/blocks/edified_button.json -c15d3ced89c882dfe552f84435fcdd560b729567 data/hexcasting/loot_tables/blocks/scroll_paper.json -1c6b077aae560e780be29e74ddcd4b0ca10ce3cf data/hexcasting/loot_tables/blocks/impetus/empty.json -dc4c6d270b8e93d05ac8ddeb1b9dd1d64828ac5d data/hexcasting/loot_tables/blocks/stripped_edified_wood.json -a62ffbcec2aa40172e05cd9fcd8e70e295d008e9 data/hexcasting/loot_tables/blocks/edified_fence_gate.json -cc7313cc33609fe1120baa7b4db631eaa29fbba1 data/hexcasting/loot_tables/blocks/citrine_edified_leaves.json -6920654f50532b5e557646e34edc4872339eb79f data/hexcasting/loot_tables/blocks/edified_log_amethyst.json -849afa706e7479d1c11bb40ae223ae5833e71286 data/hexcasting/loot_tables/blocks/scroll_paper_lantern.json -9905b767be7849e02a8e4ec4170af1bdde4e7fab data/hexcasting/loot_tables/blocks/edified_stairs.json -92528799c8ee13ff26c3c505e4dfb286c30f97c7 data/hexcasting/loot_tables/blocks/akashic_connector.json -45dc91d820caa5c421fe6f2afc7f71e45d6acd4d data/hexcasting/loot_tables/blocks/slate_pillar.json -1a1236e54c24b5aeff05919c73c76151da2cf115 data/hexcasting/loot_tables/blocks/amethyst_sconce.json -74159c21634679a6ab1dde1c181433db8b31c6ae data/hexcasting/loot_tables/blocks/edified_log_citrine.json -30f06db8c1ea74c9f4d95474e412336d065ac888 data/hexcasting/loot_tables/blocks/edified_door.json -95be0cf7f277257671631929462131b6d611119a data/hexcasting/loot_tables/inject/amethyst_cluster.json -bedbc2bd04f79372aedea64214ba2ea49cde9640 data/hexcasting/loot_tables/blocks/amethyst_edified_leaves.json -44658abcf122575878834d276ebcf5d8a6b7b398 data/hexcasting/loot_tables/blocks/aventurine_edified_leaves.json -cf6ff1ed1ee6fdbb05af16468a0a0ced79ac334e data/hexcasting/loot_tables/blocks/amethyst_bricks.json -45ae0ec668a07aa5b33d491377b2978f69f9f019 data/hexcasting/loot_tables/blocks/edified_panel.json -5f8d09e8c759d05cf9c2265ae28ea942cfbbe2be data/hexcasting/loot_tables/blocks/edified_pressure_plate.json -c426245d51f1e0fa0db7c4bfb454284d75506c9c data/hexcasting/loot_tables/blocks/quenched_allay_bricks.json -0b734693c926045b60fb515814b7a6695d0295fc data/hexcasting/loot_tables/blocks/impetus/look.json -d16fa9e366d48646686470c2d1f9bda4db3a1afa data/hexcasting/loot_tables/blocks/ancient_scroll_paper.json -2ac70e3c3600c88b2544d9755fc634216a7a523c data/hexcasting/loot_tables/blocks/edified_wood.json -509ecbb9731e75b63638c6012b2f986f131fd42f data/hexcasting/loot_tables/blocks/slate_amethyst_bricks_small.json -2902c4dae60875a1b2daf0a948a49a3419d8ec9d data/hexcasting/loot_tables/blocks/edified_log.json -434c2a6d2645e56e9a6ca56249ffa84645558e3b data/hexcasting/loot_tables/blocks/quenched_allay_bricks_small.json -65fe724d4c4ba8b0ab7d7a11bf37687413d9119d data/hexcasting/loot_tables/blocks/edified_fence.json -f1145860d80ff053970b1ad4f3b2f5d9f28e7c73 data/hexcasting/loot_tables/blocks/directrix/boolean.json -8ea8fd68719a960c2e132df441564a70c0e376a8 data/hexcasting/loot_tables/blocks/amethyst_pillar.json +// 1.20.1 2024-12-12T01:28:26.4771358 Hex Casting/Loot Tables +4efd95d408d050c36ff21b18f3c37116491fef92 data\hexcasting\loot_tables\blocks\directrix\redstone.json +c81a5cb81141ab1fe09dd5dd3a0968b69dfffbd7 data\hexcasting\loot_tables\blocks\stripped_edified_log.json +a62ffbcec2aa40172e05cd9fcd8e70e295d008e9 data\hexcasting\loot_tables\blocks\edified_fence_gate.json +8ea8fd68719a960c2e132df441564a70c0e376a8 data\hexcasting\loot_tables\blocks\amethyst_pillar.json +9905b767be7849e02a8e4ec4170af1bdde4e7fab data\hexcasting\loot_tables\blocks\edified_stairs.json +0b734693c926045b60fb515814b7a6695d0295fc data\hexcasting\loot_tables\blocks\impetus\look.json +ab86e126a704550d3f21c0b43f99fdc2665e4b09 data\hexcasting\loot_tables\blocks\slate_amethyst_tiles.json +2c9af74a82ca462e5986354966d5a0a1fd5a2083 data\hexcasting\loot_tables\blocks\slate_tiles.json +bedbc2bd04f79372aedea64214ba2ea49cde9640 data\hexcasting\loot_tables\blocks\amethyst_edified_leaves.json +45dc91d820caa5c421fe6f2afc7f71e45d6acd4d data\hexcasting\loot_tables\blocks\slate_pillar.json +6c35afda4ca349f3506fe08f86f0afe58a6f2c44 data\hexcasting\loot_tables\blocks\quenched_allay.json +2902c4dae60875a1b2daf0a948a49a3419d8ec9d data\hexcasting\loot_tables\blocks\edified_log.json +95be0cf7f277257671631929462131b6d611119a data\hexcasting\loot_tables\inject\amethyst_cluster.json +b19ac49146149555038e6d2e06200d514df1ef43 data\hexcasting\loot_tables\blocks\akashic_bookshelf.json +c426245d51f1e0fa0db7c4bfb454284d75506c9c data\hexcasting\loot_tables\blocks\quenched_allay_bricks.json +6920654f50532b5e557646e34edc4872339eb79f data\hexcasting\loot_tables\blocks\edified_log_amethyst.json +6eecc98b606d7ea5ec6f4c1fa4f63f7c1eba9223 data\hexcasting\loot_tables\blocks\slate_amethyst_bricks.json +2ad288784b0dc106ace2e6e0a40669f83476c414 data\hexcasting\loot_tables\blocks\slate.json +49940d1cb2599212e2837d7ed66c6c66e54f80f8 data\hexcasting\loot_tables\blocks\akashic_record.json +d16fa9e366d48646686470c2d1f9bda4db3a1afa data\hexcasting\loot_tables\blocks\ancient_scroll_paper.json +cc7313cc33609fe1120baa7b4db631eaa29fbba1 data\hexcasting\loot_tables\blocks\citrine_edified_leaves.json +df5496da8e48b61a171bc7a3936495c016cc002e data\hexcasting\loot_tables\blocks\directrix\empty.json +92528799c8ee13ff26c3c505e4dfb286c30f97c7 data\hexcasting\loot_tables\blocks\akashic_connector.json +434c2a6d2645e56e9a6ca56249ffa84645558e3b data\hexcasting\loot_tables\blocks\quenched_allay_bricks_small.json +601384d888edab27efe4a33027bb557eb7cb6ca2 data\hexcasting\loot_tables\blocks\edified_log_purple.json +45ae0ec668a07aa5b33d491377b2978f69f9f019 data\hexcasting\loot_tables\blocks\edified_panel.json +55f265961463a89c243ec8ac1970c70185f064a6 data\hexcasting\loot_tables\blocks\edified_button.json +7123b1a0469d7bd5bf8a2772182d222bf354df1a data\hexcasting\loot_tables\blocks\slate_bricks_small.json +509ecbb9731e75b63638c6012b2f986f131fd42f data\hexcasting\loot_tables\blocks\slate_amethyst_bricks_small.json +74159c21634679a6ab1dde1c181433db8b31c6ae data\hexcasting\loot_tables\blocks\edified_log_citrine.json +1dd4268edf7d6fa247013ab45541c7bfb915eef8 data\hexcasting\loot_tables\blocks\amethyst_bricks_small.json +499af9f15cf0a7f16fd2939e5d3af60a8089cc3e data\hexcasting\loot_tables\blocks\slate_bricks.json +30f06db8c1ea74c9f4d95474e412336d065ac888 data\hexcasting\loot_tables\blocks\edified_door.json +7c9c94d5b6b570d25eff32d4fa2ecc1e842e5231 data\hexcasting\loot_tables\blocks\quenched_allay_tiles.json +65fe724d4c4ba8b0ab7d7a11bf37687413d9119d data\hexcasting\loot_tables\blocks\edified_fence.json +cf6ff1ed1ee6fdbb05af16468a0a0ced79ac334e data\hexcasting\loot_tables\blocks\amethyst_bricks.json +8c6c0486170537d73b923a2b9f83722107fc8716 data\hexcasting\loot_tables\blocks\edified_log_aventurine.json +dc4c6d270b8e93d05ac8ddeb1b9dd1d64828ac5d data\hexcasting\loot_tables\blocks\stripped_edified_wood.json +2ab674e834184b4e17dc002556d4473cac137445 data\hexcasting\loot_tables\blocks\edified_slab.json +e6ff979aa47877c1b807075c448defd249cd3484 data\hexcasting\loot_tables\blocks\slate_amethyst_pillar.json +9ff760d5db5628328ea9274c98e18a08f1ab983e data\hexcasting\loot_tables\blocks\slate_block.json +f1145860d80ff053970b1ad4f3b2f5d9f28e7c73 data\hexcasting\loot_tables\blocks\directrix\boolean.json +44658abcf122575878834d276ebcf5d8a6b7b398 data\hexcasting\loot_tables\blocks\aventurine_edified_leaves.json +849afa706e7479d1c11bb40ae223ae5833e71286 data\hexcasting\loot_tables\blocks\scroll_paper_lantern.json +b6c23fdde4f2c22c81f008604d5ff1c32ca8eb61 data\hexcasting\loot_tables\blocks\amethyst_tiles.json +10cb1b94596ac7131efe3bd5c36c1543ddba9302 data\hexcasting\loot_tables\blocks\impetus\redstone.json +147e0739a712a9050856cebcad1757b3f418f647 data\hexcasting\loot_tables\blocks\edified_trapdoor.json +5f8d09e8c759d05cf9c2265ae28ea942cfbbe2be data\hexcasting\loot_tables\blocks\edified_pressure_plate.json +ecaeb4d5703a7aa206627ed38ee71aeb7e93d688 data\hexcasting\loot_tables\blocks\impetus\rightclick.json +a4e0194d8966a24531e43e04437cdb2a96456898 data\hexcasting\loot_tables\blocks\edified_tile.json +1a1236e54c24b5aeff05919c73c76151da2cf115 data\hexcasting\loot_tables\blocks\amethyst_sconce.json +c15d3ced89c882dfe552f84435fcdd560b729567 data\hexcasting\loot_tables\blocks\scroll_paper.json +92331eb19422730ffda0a3e52427a75aa1f7aff2 data\hexcasting\loot_tables\blocks\ancient_scroll_paper_lantern.json +b706c8a064f717c57104c48ea42aa860b45cf7a4 data\hexcasting\loot_tables\blocks\amethyst_dust_block.json +2ac70e3c3600c88b2544d9755fc634216a7a523c data\hexcasting\loot_tables\blocks\edified_wood.json +1c6b077aae560e780be29e74ddcd4b0ca10ce3cf data\hexcasting\loot_tables\blocks\impetus\empty.json +847bc3ead8a88a8f210a24e7732c28d50aa2f5dc data\hexcasting\loot_tables\blocks\edified_planks.json diff --git a/Fabric/src/generated/resources/.cache/2ba8da2cf2d44ff18dc72cc891b094eca6836a5c b/Fabric/src/generated/resources/.cache/2ba8da2cf2d44ff18dc72cc891b094eca6836a5c index 262e081e97..4388ede08c 100644 --- a/Fabric/src/generated/resources/.cache/2ba8da2cf2d44ff18dc72cc891b094eca6836a5c +++ b/Fabric/src/generated/resources/.cache/2ba8da2cf2d44ff18dc72cc891b094eca6836a5c @@ -1,25 +1,25 @@ -// 1.20.1 2024-11-19T11:30:28.203782887 Hex Casting/Tags for minecraft:item -5928bad07d3872bb60f29ef4f3c885c8e1967c20 data/hexcasting/tags/items/phial_base.json -fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data/minecraft/tags/items/wooden_doors.json -fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data/minecraft/tags/items/doors.json -37cff4ce449b8069b59b2327d78e073fc026d348 data/minecraft/tags/items/wooden_pressure_plates.json -30780136e6469a01369d7e278998edb6d7f6a16b data/hexcasting/tags/items/staves.json -20183cd61968ff6548df2dde1100b6378d68d64b data/minecraft/tags/items/wooden_buttons.json -c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data/hexcasting/tags/items/edified_logs.json -e186f43ed06770e698c886691f91b2c6acdb5a2a data/hexcasting/tags/items/seal_materials.json -4461ef6db41a675fd077dd833cfd0ea537e755be data/c/tags/items/amethyst_dusts.json -5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data/minecraft/tags/items/trapdoors.json -e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data/minecraft/tags/items/planks.json -c72a147bc65d26424df199388969ebd11119aed3 data/hexcasting/tags/items/brainswept_circle_components.json -5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data/minecraft/tags/items/wooden_trapdoors.json -bdb90cee0e88e02f0b98f12d5dd212adfaca9afd data/hexcasting/tags/items/impeti.json -e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data/hexcasting/tags/items/edified_planks.json -20183cd61968ff6548df2dde1100b6378d68d64b data/minecraft/tags/items/buttons.json -38d781b60c5c37dc025d4c7e9ec5aa680f2a5835 data/c/tags/items/gems.json -c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data/minecraft/tags/items/logs_that_burn.json -ef8ae066fea6277ba2ab43faf18757b88f7c4803 data/hexcasting/tags/items/grants_root_advancement.json -5f3b600b4fd98744bd08c993ce7bcb9c2f195cd2 data/minecraft/tags/items/leaves.json -9d18fb7a889031a704ca0e553600e1d6f8c3759d data/hexcasting/tags/items/directrices.json -c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data/minecraft/tags/items/logs.json -5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data/minecraft/tags/items/slabs.json -5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data/minecraft/tags/items/wooden_slabs.json +// 1.20.1 2024-12-12T01:28:26.4883123 Hex Casting/Tags for minecraft:item +e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data\minecraft\tags\items\planks.json +c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data\minecraft\tags\items\logs.json +20183cd61968ff6548df2dde1100b6378d68d64b data\minecraft\tags\items\wooden_buttons.json +5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data\minecraft\tags\items\slabs.json +ef8ae066fea6277ba2ab43faf18757b88f7c4803 data\hexcasting\tags\items\grants_root_advancement.json +e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data\hexcasting\tags\items\edified_planks.json +fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data\minecraft\tags\items\wooden_doors.json +4461ef6db41a675fd077dd833cfd0ea537e755be data\c\tags\items\amethyst_dusts.json +38d781b60c5c37dc025d4c7e9ec5aa680f2a5835 data\c\tags\items\gems.json +c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data\hexcasting\tags\items\edified_logs.json +c72a147bc65d26424df199388969ebd11119aed3 data\hexcasting\tags\items\brainswept_circle_components.json +30780136e6469a01369d7e278998edb6d7f6a16b data\hexcasting\tags\items\staves.json +5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data\minecraft\tags\items\wooden_trapdoors.json +5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data\minecraft\tags\items\wooden_slabs.json +9d18fb7a889031a704ca0e553600e1d6f8c3759d data\hexcasting\tags\items\directrices.json +e186f43ed06770e698c886691f91b2c6acdb5a2a data\hexcasting\tags\items\seal_materials.json +5928bad07d3872bb60f29ef4f3c885c8e1967c20 data\hexcasting\tags\items\phial_base.json +fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data\minecraft\tags\items\doors.json +37cff4ce449b8069b59b2327d78e073fc026d348 data\minecraft\tags\items\wooden_pressure_plates.json +bdb90cee0e88e02f0b98f12d5dd212adfaca9afd data\hexcasting\tags\items\impeti.json +20183cd61968ff6548df2dde1100b6378d68d64b data\minecraft\tags\items\buttons.json +5f3b600b4fd98744bd08c993ce7bcb9c2f195cd2 data\minecraft\tags\items\leaves.json +5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data\minecraft\tags\items\trapdoors.json +c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data\minecraft\tags\items\logs_that_burn.json diff --git a/Fabric/src/generated/resources/.cache/3cb4ab563deee432e7d307024048f57946bafb1c b/Fabric/src/generated/resources/.cache/3cb4ab563deee432e7d307024048f57946bafb1c index 0177cee9a1..d295e46c6b 100644 --- a/Fabric/src/generated/resources/.cache/3cb4ab563deee432e7d307024048f57946bafb1c +++ b/Fabric/src/generated/resources/.cache/3cb4ab563deee432e7d307024048f57946bafb1c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-19T11:30:28.208319781 Hex Casting/Tags for hexcasting:action -6fe30f41e2bcd48589caab26d210a513dce1ab7c data/hexcasting/tags/action/per_world_pattern.json -6fe30f41e2bcd48589caab26d210a513dce1ab7c data/hexcasting/tags/action/requires_enlightenment.json -6fe30f41e2bcd48589caab26d210a513dce1ab7c data/hexcasting/tags/action/can_start_enlighten.json +// 1.20.1 2024-12-12T01:28:26.4933098 Hex Casting/Tags for hexcasting:action +6fe30f41e2bcd48589caab26d210a513dce1ab7c data\hexcasting\tags\action\per_world_pattern.json +6fe30f41e2bcd48589caab26d210a513dce1ab7c data\hexcasting\tags\action\can_start_enlighten.json +6fe30f41e2bcd48589caab26d210a513dce1ab7c data\hexcasting\tags\action\requires_enlightenment.json diff --git a/Fabric/src/generated/resources/.cache/812fdb58b7018b2d5c5af7da57a2b1857fa66794 b/Fabric/src/generated/resources/.cache/812fdb58b7018b2d5c5af7da57a2b1857fa66794 index 82cfeba7fa..4a10315f10 100644 --- a/Fabric/src/generated/resources/.cache/812fdb58b7018b2d5c5af7da57a2b1857fa66794 +++ b/Fabric/src/generated/resources/.cache/812fdb58b7018b2d5c5af7da57a2b1857fa66794 @@ -1,34 +1,34 @@ -// 1.20.1 2024-11-19T11:30:28.20228007 Hex Casting/Tags for minecraft:block -c72a147bc65d26424df199388969ebd11119aed3 data/hexcasting/tags/blocks/brainswept_circle_components.json -357eddf3cee6f16725bed0701d57b2ca3097d74d data/minecraft/tags/blocks/mineable/shovel.json -20183cd61968ff6548df2dde1100b6378d68d64b data/minecraft/tags/blocks/buttons.json -8cd7a960fd719f200b0bf38100cd17c73b66d39c data/minecraft/tags/blocks/mineable/pickaxe.json -643994ee757a533cfb5001689e0f0263956b8a35 data/minecraft/tags/blocks/mineable/axe.json -5f3b600b4fd98744bd08c993ce7bcb9c2f195cd2 data/minecraft/tags/blocks/mineable/hoe.json -6ae561f7399e39ffa0e97bd0569aeffa9eabff6a data/hexcasting/tags/blocks/water_plants.json -e8d5ef7eabb567228b279b2419e4f042082d7491 data/minecraft/tags/blocks/fences.json -c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data/minecraft/tags/blocks/logs_that_burn.json -eba53f6c7645de4ef5ffb1e10ef34a4c23e98887 data/hexcasting/tags/blocks/cheap_to_break_block.json -7e1e353cb7f561f086898f991ece48e047991934 data/minecraft/tags/blocks/unstable_bottom_center.json -5f3b600b4fd98744bd08c993ce7bcb9c2f195cd2 data/minecraft/tags/blocks/leaves.json -281cb08b9b68ef049820c4f3f36b40820044681e data/minecraft/tags/blocks/wooden_stairs.json -6f52ca5e42991af6d7b829f626010ce304277464 data/minecraft/tags/blocks/crystal_sound_blocks.json -5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data/minecraft/tags/blocks/trapdoors.json -37cff4ce449b8069b59b2327d78e073fc026d348 data/minecraft/tags/blocks/wooden_pressure_plates.json -20183cd61968ff6548df2dde1100b6378d68d64b data/minecraft/tags/blocks/wooden_buttons.json -5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data/minecraft/tags/blocks/wooden_trapdoors.json -7acae0c88f5ead65339db1b11b16f60214434c86 data/minecraft/tags/blocks/wooden_fences.json -fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data/minecraft/tags/blocks/wooden_doors.json -7e1e353cb7f561f086898f991ece48e047991934 data/minecraft/tags/blocks/fence_gates.json -c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data/minecraft/tags/blocks/logs.json -c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data/hexcasting/tags/blocks/edified_logs.json -5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data/minecraft/tags/blocks/slabs.json -e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data/minecraft/tags/blocks/planks.json -4b84fc8b7976df220be382bdda66ecf25ceee559 data/create/tags/blocks/brittle.json -281cb08b9b68ef049820c4f3f36b40820044681e data/minecraft/tags/blocks/stairs.json -bdb90cee0e88e02f0b98f12d5dd212adfaca9afd data/hexcasting/tags/blocks/impeti.json -9d18fb7a889031a704ca0e553600e1d6f8c3759d data/hexcasting/tags/blocks/directrices.json -37cff4ce449b8069b59b2327d78e073fc026d348 data/minecraft/tags/blocks/pressure_plates.json -fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data/minecraft/tags/blocks/doors.json -5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data/minecraft/tags/blocks/wooden_slabs.json -e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data/hexcasting/tags/blocks/edified_planks.json +// 1.20.1 2024-12-12T01:28:26.4847791 Hex Casting/Tags for minecraft:block +e8d5ef7eabb567228b279b2419e4f042082d7491 data\minecraft\tags\blocks\fences.json +7e1e353cb7f561f086898f991ece48e047991934 data\minecraft\tags\blocks\fence_gates.json +fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data\minecraft\tags\blocks\doors.json +c72a147bc65d26424df199388969ebd11119aed3 data\hexcasting\tags\blocks\brainswept_circle_components.json +5f3b600b4fd98744bd08c993ce7bcb9c2f195cd2 data\minecraft\tags\blocks\leaves.json +bdb90cee0e88e02f0b98f12d5dd212adfaca9afd data\hexcasting\tags\blocks\impeti.json +37cff4ce449b8069b59b2327d78e073fc026d348 data\minecraft\tags\blocks\pressure_plates.json +8cd7a960fd719f200b0bf38100cd17c73b66d39c data\minecraft\tags\blocks\mineable\pickaxe.json +c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data\minecraft\tags\blocks\logs_that_burn.json +357eddf3cee6f16725bed0701d57b2ca3097d74d data\minecraft\tags\blocks\mineable\shovel.json +4b84fc8b7976df220be382bdda66ecf25ceee559 data\create\tags\blocks\brittle.json +5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data\minecraft\tags\blocks\slabs.json +7acae0c88f5ead65339db1b11b16f60214434c86 data\minecraft\tags\blocks\wooden_fences.json +281cb08b9b68ef049820c4f3f36b40820044681e data\minecraft\tags\blocks\wooden_stairs.json +5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data\minecraft\tags\blocks\trapdoors.json +643994ee757a533cfb5001689e0f0263956b8a35 data\minecraft\tags\blocks\mineable\axe.json +5216ba5c57db29b8dee9aebc63a2e3b17c97dc17 data\minecraft\tags\blocks\wooden_trapdoors.json +20183cd61968ff6548df2dde1100b6378d68d64b data\minecraft\tags\blocks\wooden_buttons.json +37cff4ce449b8069b59b2327d78e073fc026d348 data\minecraft\tags\blocks\wooden_pressure_plates.json +6f52ca5e42991af6d7b829f626010ce304277464 data\minecraft\tags\blocks\crystal_sound_blocks.json +6ae561f7399e39ffa0e97bd0569aeffa9eabff6a data\hexcasting\tags\blocks\water_plants.json +9d18fb7a889031a704ca0e553600e1d6f8c3759d data\hexcasting\tags\blocks\directrices.json +7e1e353cb7f561f086898f991ece48e047991934 data\minecraft\tags\blocks\unstable_bottom_center.json +c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data\minecraft\tags\blocks\logs.json +20183cd61968ff6548df2dde1100b6378d68d64b data\minecraft\tags\blocks\buttons.json +e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data\minecraft\tags\blocks\planks.json +e5df19a1dc6eadf14cd9b0f0fe45a74330b745e9 data\hexcasting\tags\blocks\edified_planks.json +5bbfd513fd2eb2090b0c2d1ec33504deb79d53b9 data\minecraft\tags\blocks\wooden_slabs.json +fdb48f194d7937ab6b423fa4b90a4d438bf6dd90 data\minecraft\tags\blocks\wooden_doors.json +281cb08b9b68ef049820c4f3f36b40820044681e data\minecraft\tags\blocks\stairs.json +eba53f6c7645de4ef5ffb1e10ef34a4c23e98887 data\hexcasting\tags\blocks\cheap_to_break_block.json +5f3b600b4fd98744bd08c993ce7bcb9c2f195cd2 data\minecraft\tags\blocks\mineable\hoe.json +c562b4be24d0b6b13f3c65599d3bfa3bf2c4ce21 data\hexcasting\tags\blocks\edified_logs.json diff --git a/Fabric/src/generated/resources/.cache/c70ef2fe5da52437c1f53bcc9ea0e416f16bcc0b b/Fabric/src/generated/resources/.cache/c70ef2fe5da52437c1f53bcc9ea0e416f16bcc0b index f29d046638..c85b073fc8 100644 --- a/Fabric/src/generated/resources/.cache/c70ef2fe5da52437c1f53bcc9ea0e416f16bcc0b +++ b/Fabric/src/generated/resources/.cache/c70ef2fe5da52437c1f53bcc9ea0e416f16bcc0b @@ -1,220 +1,220 @@ -// 1.20.1 2024-11-19T11:30:28.205075318 Hex Casting/Recipes -f482a4349786388cc8f11d5550548f7d60265438 data/hexcasting/recipes/staff/mangrove.json -b10d590e918e35b16578a8b739a1c4e7e2202e16 data/hexcasting/advancements/recipes/misc/dye_colorizer_cyan.json -7aa3bf4a3d6fb92743b29dfe89d50537fefc0db9 data/hexcasting/advancements/recipes/misc/pride_colorizer_intersex.json -648f1862fde1dd8ade80b2991b8c8e3991389e95 data/hexcasting/recipes/dye_colorizer_light_blue.json -23eff6111b0385b66d3ad5fbabfc625f426517a6 data/hexcasting/advancements/recipes/brainsweep/brainsweep/directrix_redstone.json -a3130e3098e35b75afae4f31996d9ab7468e0bc3 data/hexcasting/advancements/recipes/tools/thought_knot.json -c8f2ad363e4d20054f4e56fde02c8775a45a7169 data/hexcasting/recipes/artifact.json -f80dbf59957be175fbcd63224005e09c4cd1a122 data/hexcasting/recipes/compat/farmersdelight/cutting/edified_log_citrine.json -2fff80cd3dabd2bc1744eecd72b2364b0f91c7c1 data/hexcasting/advancements/recipes/misc/dye_colorizer_yellow.json -9269b17eaae3217422352354fc6006c9808b398c data/hexcasting/recipes/dye_colorizer_black.json -441f336edb635e5d8c2a7183906fed1c501f06fd data/hexcasting/recipes/pride_colorizer_bisexual.json -a72a0fcc0f3a81d31b30a7a626aef537796ca73b data/hexcasting/advancements/recipes/tools/staff/quenched.json -2aa7d74e29a7c5ee4f1b8835cf7c6109eed81d77 data/hexcasting/recipes/brainsweep/quench_allay.json -2c292e12b5e85b1701740c222e5c5465799ad1dc data/hexcasting/recipes/pride_colorizer_aroace.json -5d6d73e16a36da5f9df6a7b8ac859181d401766d data/hexcasting/recipes/uuid_colorizer.json -49e706193bb57a957091e419bd0d8aa58135da1f data/hexcasting/recipes/dye_colorizer_green.json -2cea013887734cbc4971bcd57e7e4f6a2b25c8e1 data/hexcasting/advancements/recipes/tools/focus.json -36d26f34d0405ff2d1e728e5b5174502686e3590 data/hexcasting/advancements/recipes/brainsweep/brainsweep/budding_amethyst.json -daa7b13d5370f4306f8cdf3037fc346e8918950a data/hexcasting/recipes/dye_colorizer_brown.json -b94bc4dd4a63db10af86c524ba00eae157c1824b data/hexcasting/advancements/recipes/building_blocks/edified_fence_gate.json -9ea4fe5272ce2241d98f30359f55cfc1936c7b48 data/hexcasting/advancements/recipes/tools/staff/cherry.json -e0609202271e402d8ae58e4f8eaf11dcdda10a9e data/hexcasting/recipes/brainsweep/akashic_record.json -c3f7b03fe184ed5e54a8ae06d130adf507b7683d data/hexcasting/recipes/staff/bamboo.json -7ca0f9fc6e8ae1ad08ef5c29a0b279b891f7d8d4 data/hexcasting/advancements/recipes/misc/pride_colorizer_aroace.json -4aaefc65af5fe69d312247fdda7d983edf8dcd9a data/hexcasting/recipes/pride_colorizer_intersex.json -641d8c38b8109665314fccbebd9068ba10b04118 data/hexcasting/advancements/recipes/misc/dye_colorizer_gray.json -fd2f25b0a71806c96af5a307fad76f66de6210a4 data/hexcasting/advancements/recipes/building_blocks/slate_block.json -b1f8375aaf0d66035dee720ea59605f69fc0a154 data/hexcasting/recipes/edified_fence.json -ae88fcdecbfbdd0a0fe778467421a3b32d7ed735 data/create/recipes/crushing/amethyst_cluster.json -6ed61e03c51dc653cd66e643a6d33fe9105ff171 data/hexcasting/advancements/recipes/brainsweep/brainsweep/directrix_boolean.json -8b7136c206b799a2e394aa02316b0509674ff64f data/hexcasting/advancements/recipes/tools/staff/bamboo.json -fb852d8e4bcfa7b75f41a6ac7dc1e76b00d95fb1 data/hexcasting/advancements/recipes/misc/dye_colorizer_red.json -5401828f85e709b5817ecc8464dc63e536a730dc data/hexcasting/recipes/staff/cherry.json -54335e0004423899ad37763a1d8456cc0a6e72a7 data/hexcasting/advancements/recipes/misc/decompose_quenched_shard/charged.json -c1846dd794f5cc5814b8a839291e82512a02ba12 data/hexcasting/advancements/recipes/misc/pride_colorizer_plural.json -0ead307e47242ba140584f6bd20088a1fa7c2909 data/hexcasting/recipes/directrix/empty.json -b7084f131b0cdb9c2c698a3c5b3450d69e788d6e data/hexcasting/recipes/dye_colorizer_yellow.json -55ea553a96e1d6a54385890f7c48fe7b2bed6871 data/hexcasting/advancements/recipes/tools/trinket.json -2003fed3aa4eb622b6b07a9e65946fb40be14420 data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_rightclick.json -1b092acfc3115702c74e141492e649d58512f259 data/hexcasting/recipes/staff/oak.json -5a90084c03d6e8424872870c8b65f4771b447f03 data/hexcasting/recipes/brainsweep/budding_amethyst.json -61e53f02baefd31308e99407d56403dfc18e36e1 data/hexcasting/recipes/akashic_connector.json -93ed0491548920bc75797d18501c750ef07fe3ea data/hexcasting/advancements/recipes/misc/pride_colorizer_bisexual.json -0f2e63a9361d18aac764f6a4a4f13b9b862ac2ee data/hexcasting/recipes/compat/create/crushing/amethyst_shard.json -c4b985635c3b1a519d7a83da65daba5bdd3a5f59 data/hexcasting/advancements/recipes/decorations/ageing_scroll_paper_lantern.json -b6720c1c73455ad817bac9b5ca2ca045c5c4050c data/hexcasting/recipes/pride_colorizer_agender.json -5f216dbb7b89fd837e2dd73e3ed41c8d412de234 data/hexcasting/advancements/recipes/misc/decompose_quenched_shard/dust.json -903cbe4d4c4e5abcd5e006f9d0237e8c596228ba data/hexcasting/recipes/edified_tile.json -fb486df96798724da2fcc0df5706f19bc1ff94dc data/hexcasting/advancements/recipes/misc/dye_colorizer_light_blue.json -410bfde90cb977db3f13814e94484fa11fca7cfc data/hexcasting/recipes/thought_knot.json -30352d8ad510768770bb1b2d378959b7a502f825 data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_look.json -a8cab28cffdf495253a320094d202fccc5aeb113 data/hexcasting/advancements/recipes/decorations/ancient_scroll_paper_lantern.json -af8fe74b624df4a31727347b9826614a66092b0a data/hexcasting/advancements/recipes/misc/pride_colorizer_agender.json -e765ee2bd324240e8ed3d625be431de3281f0070 data/hexcasting/recipes/dye_colorizer_gray.json -a0b87b1b21506708d09c9295b7afc13de6b1fce6 data/hexcasting/recipes/pride_colorizer_aromantic.json -4d941fc399c6b7a470513a572ecd88982823da84 data/hexcasting/advancements/recipes/building_blocks/edified_wood.json -aa1caae7eba6aede0f179619488e2253b3b723dd data/hexcasting/recipes/focus_rotated.json -505eb9192df0b48867e58e09ce36b2259dc6d3e8 data/hexcasting/advancements/recipes/decorations/scroll.json -1d1e73244fb3da633d8a5f84bad93c6022a94368 data/hexcasting/advancements/recipes/misc/pride_colorizer_demiboy.json -71d38559bf455ea343ac0237a57db4d3f0833a7c data/hexcasting/advancements/recipes/misc/dye_colorizer_magenta.json -fd7c8325fcaa6a718e90c09251b447fb365523d4 data/hexcasting/recipes/pride_colorizer_demiboy.json -b5946314683e5a823b577a18d13fb437a35aafd5 data/hexcasting/recipes/decompose_quenched_shard/charged.json -011f8daf15148d4b77686c6d382d8f5c288a333d data/hexcasting/advancements/recipes/building_blocks/ancient_scroll_paper.json -494aa470790ae46baebbf24ee5b76f5885c1af1a data/hexcasting/recipes/ageing_scroll_paper_lantern.json -c6228d72ca800a7dd336e82bbb9b4f20f89de29d data/hexcasting/advancements/recipes/redstone/edified_pressure_plate.json -5889e2df2fb4e1ea29f2590b96bb3aa94961a09a data/hexcasting/recipes/scroll.json -a9111ff52513200af47b79cf98b2e545699497bb data/hexcasting/advancements/recipes/building_blocks/amethyst_tiles.json -e9166f40c8797cdbf3d8062dfa35c74f850f1000 data/hexcasting/advancements/recipes/misc/dye_colorizer_white.json -2c56c267e23e75d5a3b9358d424d69642e001b50 data/hexcasting/recipes/decompose_quenched_shard/dust.json -ea87956c49dcfabb0d39af45c016130d258181da data/hexcasting/recipes/staff/birch.json -98c0843e6a83b91820f1c720e206295eec20ff95 data/hexcasting/recipes/ancient_scroll_paper.json -bc8fe4d2f55fe119b0b146a71782a3d4788380b1 data/create/recipes/crushing/amethyst_block.json -97062771a426f6e4b9e3bfd6daa62b1d4b3c7039 data/hexcasting/recipes/abacus.json -24c244e53c7e47b85845d2ee36b1665410cf495a data/hexcasting/recipes/edified_planks.json -417695497a95436186c1a4ed842d7975d754f9eb data/hexcasting/recipes/stripped_edified_wood.json -7f2f29981df2ca4464ee0250180e670f5331f65b data/hexcasting/recipes/dye_colorizer_pink.json -ea63e49709bd80cb9f4cd1fe13e9bd0281101c9a data/hexcasting/recipes/slate.json -f64fa00d85a9abb24e89b0d2c9f818001371f5e6 data/hexcasting/recipes/slate_block.json -14f3b217e150efbbff329d67aec96f818a1da99c data/hexcasting/recipes/dye_colorizer_purple.json -9b7c5220fbaf3e84fa9e81eae322eed5d37b22d3 data/hexcasting/recipes/pride_colorizer_transgender.json -17a1adf747b99848381ca8e7c5e2cd9dd96c014f data/hexcasting/advancements/recipes/misc/default_colorizer.json -a85cfbd7988f5df0b18d160591605aea8e6808d2 data/hexcasting/recipes/trinket.json -4003f297be29810cebde4995fb2838c2c68a25ea data/hexcasting/recipes/pride_colorizer_lesbian.json -41a570f970c9af8229cb1140a11a5220fac00957 data/hexcasting/advancements/recipes/tools/staff/spruce.json -b300f7729e75614fce412457f6717686680f81da data/hexcasting/recipes/sub_sandwich.json -0b951ce7b9d1bfb07ae012b12225b595d36c6e66 data/hexcasting/recipes/amethyst_dust_packing.json -2b64261bd4aefdc55d35400f25835434f88856cf data/hexcasting/recipes/amethyst_tiles.json -963d87d2738686e5398a178b8b369228ff067403 data/hexcasting/recipes/spellbook.json -6e2dc32f975d987b8dfd329507334f647bceadc0 data/hexcasting/advancements/recipes/tools/staff/mangrove.json -996c8361766377a70e0b5a5caff3076fc6031b0a data/hexcasting/recipes/impetus/empty.json -71f821f5d24b0bf9ecd860d51e055628fe4af50c data/hexcasting/recipes/edified_panel.json -7166cd4355d11c209bc7749bc862caddcfd795fb data/hexcasting/recipes/dye_colorizer_cyan.json -f347f4ce869207e62a7887df1252505a3432e12a data/hexcasting/recipes/pride_colorizer_genderfluid.json -1b570b35288be9f6faab1536d6e45cb52eb088c0 data/hexcasting/advancements/recipes/tools/staff/dark_oak.json -31ec6474ddae967a6c1dadf9be8292d375510364 data/hexcasting/advancements/recipes/building_blocks/edified_tile.json -5e66982df6a1074c81f381898033b521ca337695 data/hexcasting/recipes/staff/quenched.json -45915b542d8070f2502a4047218679b08033b12d data/hexcasting/advancements/recipes/decorations/scroll_paper_lantern.json -946cde51bbfc2af344b078f6b39389ffc44462f4 data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_storedplayer.json -1093cccc6b1c45eb91f7c1680ef575a7bffb2744 data/hexcasting/advancements/recipes/building_blocks/edified_planks.json -72447ac69a0d85f91064180d3c852040a9e33832 data/hexcasting/recipes/pride_colorizer_asexual.json -0e792d49c81d2164e827d1bdedaa0fa358dfc437 data/hexcasting/advancements/recipes/misc/pride_colorizer_aromantic.json -b84c113ef5321c9df9ac9080de03e8d8639feab2 data/hexcasting/advancements/recipes/misc/pride_colorizer_genderqueer.json -e6a592721234448f2ee7ec402bca10a9b78b4677 data/hexcasting/advancements/recipes/decorations/slate.json -de38d15e7a91c77df24c1dc954b3e98ee197876f data/hexcasting/recipes/focus.json -157ee5fba985bbd01a87f44578890dab5489a8e5 data/hexcasting/advancements/recipes/misc/dye_colorizer_green.json -c1541738df1ee41c362ad3b9c3a9f0e181bd5c62 data/hexcasting/recipes/pride_colorizer_plural.json -233aeedc73173427e7b2287772a4f914f97b072c data/hexcasting/recipes/dye_colorizer_red.json -12bd3d04c791ef16aad5e992f038d6726229a436 data/hexcasting/advancements/recipes/tools/artifact.json -862f1a61a296a834df8a93dbd5a6cdfa2df15721 data/hexcasting/advancements/recipes/tools/staff/acacia.json -a1f9df0537c0ef33a1164cf94e8ff4b1094f889f data/hexcasting/advancements/recipes/tools/staff/warped.json -b6e762c198b9632defd7f8b11287702abecd681d data/hexcasting/recipes/staff/mindsplice.json -7c479398bbc7185a2c3efd568ad266d8109245bf data/hexcasting/advancements/recipes/redstone/edified_door.json -5fab1b9c93304a53a4c305b511704458e4593444 data/hexcasting/recipes/pride_colorizer_demigirl.json -e536791d0c6fb48206e6e30d56879eaf0a9e4bd7 data/hexcasting/recipes/akashic_bookshelf.json -b90ad4cbffc2e3c01671dfe8bda5e42d9b8a685c data/hexcasting/advancements/recipes/tools/staff/crimson.json -68ab70e0b4e432a3492767c5597ecd836f106714 data/hexcasting/advancements/recipes/tools/staff/mindsplice.json -c2ef04b311251b4eb22320b2f5313c54533a9974 data/hexcasting/advancements/recipes/tools/staff/birch.json -1a0d55e6824c078453c1d44e885a1c51ba707a41 data/hexcasting/recipes/dye_colorizer_white.json -8f8773a541bc6a4a6c55a23f4f98b5da4f61a031 data/hexcasting/recipes/scroll_paper.json -bc729ac7cf84d29a99cd34d50c152c0b9d20bd7a data/hexcasting/advancements/recipes/brainsweep/brainsweep/akashic_record.json -4a803e049915fd3c7144155ae3a1b05a917ea290 data/hexcasting/recipes/pride_colorizer_pansexual.json -8bea75fdc5e64c464dcf5f85166e767ff44e6dc2 data/hexcasting/advancements/recipes/misc/pride_colorizer_lesbian.json -0654e70ed1ed8be20ae3dd9f4955cd14f9fa40d0 data/hexcasting/advancements/recipes/tools/staff/jungle.json -5e98cec2084f0cfbb959c3ec39bd85a3369f443b data/hexcasting/advancements/recipes/tools/abacus.json -0b172aef920da7ba63fe152903ce005c1f5df5f1 data/hexcasting/recipes/staff/acacia.json -7e1a5a873d655e0efba80f22ae9b1de4f248e67a data/hexcasting/advancements/recipes/misc/decompose_quenched_shard/shard.json -3608f0ec056f2c5d29a9a89305218497fd2c4383 data/hexcasting/recipes/stonecutting/amethyst_tiles.json -2a2f60fb0f63ee278b74c418acf04575304c521f data/hexcasting/advancements/recipes/tools/jeweler_hammer.json -8c043c7f6a7911b67324e2fd42f0b3b19a792af3 data/hexcasting/recipes/ancient_scroll_paper_lantern.json -4680e9dafcf9b60b3485609519d66eefcfd539bc data/hexcasting/recipes/staff/dark_oak.json -095aeb2882c6849f10fb6536e7c780790778e5e7 data/hexcasting/recipes/staff/jungle.json -b624d103d944a8a1d4d8a9e85c198a5492b476f8 data/hexcasting/advancements/recipes/redstone/edified_trapdoor.json -eb9ebf77f0daa32f665a60888fcda19c940f0b2f data/hexcasting/advancements/recipes/misc/pride_colorizer_demigirl.json -8f7b81add0153ad94900acc66cd8174ae7115f64 data/hexcasting/advancements/recipes/building_blocks/slate_block_from_slates.json -838b91c33a72a58aa286607eaaa17cdd6b4c90ba data/hexcasting/recipes/amethyst_sconce.json -664ce1a38c9b1c9ec21b7e078631e181fc0b2498 data/hexcasting/recipes/staff/edified.json -7522be58b09554a3f1a54d5b2343c3eab01447a3 data/hexcasting/recipes/dye_colorizer_magenta.json -ee5db13cbb33d9c62bcb1eb645e2c4bea97ad44a data/hexcasting/advancements/recipes/building_blocks/amethyst_dust_unpacking.json -203b7035125390abb4ed77b3a4dca8f8f8f57bc5 data/hexcasting/recipes/dye_colorizer_light_gray.json -00853ec1885c1f72674c07caf6fd04904e248f8f data/hexcasting/recipes/brainsweep/directrix_boolean.json -f8ee073c1c03f1c11147e4801eeba1f86e5459ba data/hexcasting/recipes/dye_colorizer_blue.json -a366ea3750adc0d336ab8f318c40baed3f9c3eb7 data/hexcasting/recipes/brainsweep/impetus_storedplayer.json -51b047601368a103be166d907633b196d2d8a4e8 data/hexcasting/recipes/compat/farmersdelight/cutting/edified_log.json -f4c56ea7143ce92a0ae0b663310e53644a7309f7 data/hexcasting/advancements/recipes/misc/pride_colorizer_pansexual.json -6f2634e5588aede8e29157ecc859652d8a9f4065 data/hexcasting/advancements/recipes/misc/dye_colorizer_orange.json -f1bae034d27d218bf262a8c777b787d232489f16 data/hexcasting/recipes/lens.json -06402fb37fe4bb05918d13dbfdb89f4c2b67f3ec data/hexcasting/advancements/recipes/tools/cypher.json -ed5c690324e3d9b55599f00f078ae225072a2e7f data/hexcasting/recipes/brainsweep/impetus_rightclick.json -c43fb770003c8d882fd9c1e7d1ecb5f196cba1ab data/hexcasting/recipes/cypher.json -4d5e4a6374731b2d0a90c70a5d489703fd966977 data/hexcasting/advancements/recipes/misc/dye_colorizer_lime.json -0864e8b86bdad0bf9ab2ddeb0cd5a182808b5a0a data/hexcasting/recipes/default_colorizer.json -7d71eb93bbb0856167cf4521283e39f0048078ee data/hexcasting/advancements/recipes/redstone/edified_button.json -72f70637aea1c11683e9ee91d83c2807c6ec33a9 data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_trapdoor.json -1e51cd4f527b3aea4d61d91829e47c191c9c05bb data/hexcasting/recipes/pride_colorizer_gay.json -42b8e462de1d7006de3a7658757377450e773107 data/hexcasting/advancements/recipes/misc/dye_colorizer_blue.json -775560efa36581389c0319435bda035be262ed4f data/hexcasting/advancements/recipes/building_blocks/edified_stairs.json -09096a40275b6c49d4b4e6984869aa43b34712c3 data/hexcasting/recipes/dynamicseal_focus.json -8f515bf8ccea70b3d88845ed83966dc0c66082f6 data/hexcasting/advancements/recipes/tools/staff/oak.json -b29f9d9c14e60ded1148680e2e0ef405b5a3c845 data/hexcasting/advancements/recipes/misc/uuid_colorizer.json -071e5875b13b60aac33bc97e408d2ca710ac5d02 data/hexcasting/advancements/recipes/building_blocks/stonecutting/amethyst_tiles.json -3bf96944a8eed8b8d3f5d96b609297727c078cb7 data/hexcasting/advancements/recipes/misc/dye_colorizer_purple.json -846baaef37844216b57bb9b35e52b1bb6b56b413 data/hexcasting/advancements/recipes/decorations/scroll_small.json -db5ae3a2fda235cf1c83fd83e0026a262e668217 data/hexcasting/advancements/recipes/building_blocks/edified_slab.json -6493676f8ca93a7be8d70e25d69ddad935b3f16b data/hexcasting/advancements/recipes/tools/lens.json -a8d604ba059d54502837809815d3ac9bbcaa89bf data/hexcasting/advancements/recipes/redstone/akashic_bookshelf.json -0aaf55492e850d2bb1ec2f9986406ca61fde4cfd data/hexcasting/recipes/dye_colorizer_lime.json -dcc9bf721dd40724abcc69f1f7e8a1610dbf88f3 data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_door.json -f81053a3269c1b371be3f8057bad4803056ee0f9 data/hexcasting/recipes/dye_colorizer_orange.json -f77518b6993fe8e31de10af286c33ab72c0f9077 data/hexcasting/advancements/recipes/redstone/impetus/empty.json -3b03fdae3896212a0b8b9b3a2d4880d197e67d2d data/hexcasting/recipes/jeweler_hammer.json -d7de5d626fd799a2522af36f0c62c52fe490e6d2 data/hexcasting/recipes/edified_door.json -aa7558ec1baf6070efbe448d886e20e964e33f96 data/hexcasting/advancements/recipes/brainsweep/brainsweep/quench_allay.json -cedc2889c4f327b18755bbe8c3c595d302e2a9d0 data/hexcasting/recipes/decompose_quenched_shard/shard.json -8c52917fc7041c483fb6dfe8d16c90f096f2beaf data/hexcasting/recipes/compat/farmersdelight/cutting/edified_log_amethyst.json -40ed21dc80d39236ca0e6d2cea60861c637cf931 data/hexcasting/advancements/recipes/misc/pride_colorizer_nonbinary.json -ef96ae9709ec931ce6b6af8a539f9bc483236449 data/hexcasting/recipes/scroll_medium.json -61fafd43af83bdca6720d0993ab71f40a8bebd40 data/hexcasting/advancements/recipes/redstone/akashic_connector.json -f08a0aee92b281ae325d907e6fe4a3b03980f2aa data/hexcasting/advancements/recipes/tools/staff/edified.json -7552df3fc726cc4cdaa88aa4823eff6ce069fb75 data/hexcasting/recipes/slate_block_from_slates.json -77369113dc54d1c64b9101861dd8a1930bf1c1c4 data/hexcasting/recipes/edified_wood.json -1ad54df5eaee3d1e810d2c91bd03f626084e30b6 data/hexcasting/recipes/edified_trapdoor.json -ce9d0b976f7cc8ad4a0815bbea6c43115addb90f data/hexcasting/advancements/recipes/building_blocks/scroll_paper.json -af9a260c24e0a65eea321f0dd9dd2fa7d648707f data/hexcasting/advancements/recipes/building_blocks/amethyst_dust_packing.json -923e7cd200518042f11474713eca9ccad126dab7 data/hexcasting/recipes/staff/spruce.json -ad647a2078099344ea7f9836a68e1bf8e8119277 data/hexcasting/advancements/recipes/misc/dye_colorizer_brown.json -0038883bd294cc8a1b324d6782478d5e37b4dbf9 data/hexcasting/advancements/recipes/misc/dye_colorizer_pink.json -170af3c83a45f9550827cc48e4bb5a621d06d685 data/hexcasting/advancements/recipes/misc/pride_colorizer_transgender.json -8815ea5d8d7379062e050adc5736cc579c3bdd9e data/hexcasting/recipes/edified_stairs.json -b6fa898369ac52cdd9d7f91e3b8a2cb881c3829f data/hexcasting/advancements/recipes/decorations/scroll_medium.json -04902d4eca30560bc601a8196d82f74f3fa5b191 data/hexcasting/recipes/dynamicseal_spellbook.json -d6b7a9392320c11866b3f139f97977dc9f55bc47 data/hexcasting/recipes/scroll_small.json -8e48c680b38666c2e7da71fbe4ceddf5d99a5cbc data/hexcasting/advancements/recipes/food/sub_sandwich.json -5e28e2c352366720ce91b73f8c8c38e217f7198d data/hexcasting/recipes/edified_fence_gate.json -004e0694b3bf53140be7df89a4defc255b800619 data/hexcasting/advancements/recipes/tools/focus_rotated.json -faaa9c39dbcdd131c5fbec9ac6a26d6dc5e72053 data/hexcasting/advancements/recipes/misc/dye_colorizer_light_gray.json -55602e415fc1b797439b674050887e9e388558c9 data/hexcasting/advancements/recipes/building_blocks/edified_panel.json -151875101066f7af5788c7a2e1c6b342971a546a data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_wood.json -0bd7c9f4a9bf29c1b63b2f9378f0a7e2f594b7b7 data/hexcasting/recipes/pride_colorizer_nonbinary.json -ea46e570a43cd3ea1cc78c51d9da45d93944730a data/hexcasting/advancements/recipes/redstone/directrix/empty.json -b20be6eb5a8b60567871444e65d773ec9a67ece1 data/hexcasting/recipes/staff/crimson.json -c03c81dc123294472e8bb6f836c319e96f8db4f5 data/hexcasting/advancements/recipes/building_blocks/edified_fence.json -92bdf87687d8823036fae6bd01782c653831286b data/hexcasting/recipes/brainsweep/impetus_look.json -06ca609ba1a32f094cf6edbc989bc9ddaf9d342c data/hexcasting/advancements/recipes/misc/pride_colorizer_genderfluid.json -552c235dc58a46a3e57913c9b9faf3f21abeae32 data/hexcasting/advancements/recipes/building_blocks/stripped_edified_wood.json -c2a0a489967db4064dfbe1ee6367e132665f3c00 data/hexcasting/recipes/edified_slab.json -1a9dd55a24f56a4e9467f1117e0898f7e71ade67 data/hexcasting/advancements/recipes/decorations/amethyst_sconce.json -27dc4a1647f264c45b27f5552fd9403a02853484 data/hexcasting/advancements/recipes/tools/spellbook.json -2eacf53894ae97712dc3874777e29dce0a0e5540 data/hexcasting/advancements/recipes/misc/pride_colorizer_asexual.json -e11aeded7f5d3fdd224627c67661bbd993901703 data/hexcasting/recipes/edified_pressure_plate.json -e691130641b11c0a030a51c71dee0ba356f3b5bd data/hexcasting/recipes/compat/farmersdelight/cutting/edified_log_aventurine.json -7baf0777533737aef68bcac36944943b77138d29 data/hexcasting/recipes/edified_button.json -63189af501442318a90c16d6951e51c0c5d6d4f3 data/hexcasting/recipes/compat/farmersdelight/cutting/edified_log_purple.json -499c5c09e3772989350f9ab3264b8692449a6dea data/hexcasting/advancements/recipes/misc/pride_colorizer_gay.json -b16ff5314d457bc7e9e224e102d1e04ce3a62361 data/hexcasting/recipes/brainsweep/directrix_redstone.json -bd63b845e02ee4b1b9abe168a196335ccbed1ca5 data/hexcasting/recipes/scroll_paper_lantern.json -afb422ad4a918ee0161bf077f09475bb1da2b4eb data/hexcasting/recipes/amethyst_dust_unpacking.json -d47352426739a0fc500a385d820d767a307e1d16 data/hexcasting/advancements/recipes/misc/dye_colorizer_black.json -f0e71ae8c6a9170669f44096a55a875d11497c56 data/hexcasting/recipes/staff/warped.json -78958099bf4337ad281580d90f434b3074ad18c8 data/hexcasting/recipes/pride_colorizer_genderqueer.json +// 1.20.1 2024-12-12T01:28:26.4893103 Hex Casting/Recipes +1d1e73244fb3da633d8a5f84bad93c6022a94368 data\hexcasting\advancements\recipes\misc\pride_colorizer_demiboy.json +49e706193bb57a957091e419bd0d8aa58135da1f data\hexcasting\recipes\dye_colorizer_green.json +071e5875b13b60aac33bc97e408d2ca710ac5d02 data\hexcasting\advancements\recipes\building_blocks\stonecutting\amethyst_tiles.json +fb852d8e4bcfa7b75f41a6ac7dc1e76b00d95fb1 data\hexcasting\advancements\recipes\misc\dye_colorizer_red.json +9269b17eaae3217422352354fc6006c9808b398c data\hexcasting\recipes\dye_colorizer_black.json +5d6d73e16a36da5f9df6a7b8ac859181d401766d data\hexcasting\recipes\uuid_colorizer.json +e11aeded7f5d3fdd224627c67661bbd993901703 data\hexcasting\recipes\edified_pressure_plate.json +8c52917fc7041c483fb6dfe8d16c90f096f2beaf data\hexcasting\recipes\compat\farmersdelight\cutting\edified_log_amethyst.json +d6b7a9392320c11866b3f139f97977dc9f55bc47 data\hexcasting\recipes\scroll_small.json +c1846dd794f5cc5814b8a839291e82512a02ba12 data\hexcasting\advancements\recipes\misc\pride_colorizer_plural.json +17a1adf747b99848381ca8e7c5e2cd9dd96c014f data\hexcasting\advancements\recipes\misc\default_colorizer.json +f347f4ce869207e62a7887df1252505a3432e12a data\hexcasting\recipes\pride_colorizer_genderfluid.json +f8ee073c1c03f1c11147e4801eeba1f86e5459ba data\hexcasting\recipes\dye_colorizer_blue.json +b16ff5314d457bc7e9e224e102d1e04ce3a62361 data\hexcasting\recipes\brainsweep\directrix_redstone.json +862f1a61a296a834df8a93dbd5a6cdfa2df15721 data\hexcasting\advancements\recipes\tools\staff\acacia.json +ea87956c49dcfabb0d39af45c016130d258181da data\hexcasting\recipes\staff\birch.json +5e66982df6a1074c81f381898033b521ca337695 data\hexcasting\recipes\staff\quenched.json +ee5db13cbb33d9c62bcb1eb645e2c4bea97ad44a data\hexcasting\advancements\recipes\building_blocks\amethyst_dust_unpacking.json +f4c56ea7143ce92a0ae0b663310e53644a7309f7 data\hexcasting\advancements\recipes\misc\pride_colorizer_pansexual.json +3b03fdae3896212a0b8b9b3a2d4880d197e67d2d data\hexcasting\recipes\jeweler_hammer.json +7ca0f9fc6e8ae1ad08ef5c29a0b279b891f7d8d4 data\hexcasting\advancements\recipes\misc\pride_colorizer_aroace.json +b6fa898369ac52cdd9d7f91e3b8a2cb881c3829f data\hexcasting\advancements\recipes\decorations\scroll_medium.json +0654e70ed1ed8be20ae3dd9f4955cd14f9fa40d0 data\hexcasting\advancements\recipes\tools\staff\jungle.json +1b570b35288be9f6faab1536d6e45cb52eb088c0 data\hexcasting\advancements\recipes\tools\staff\dark_oak.json +505eb9192df0b48867e58e09ce36b2259dc6d3e8 data\hexcasting\advancements\recipes\decorations\scroll.json +09096a40275b6c49d4b4e6984869aa43b34712c3 data\hexcasting\recipes\dynamicseal_focus.json +b7084f131b0cdb9c2c698a3c5b3450d69e788d6e data\hexcasting\recipes\dye_colorizer_yellow.json +55602e415fc1b797439b674050887e9e388558c9 data\hexcasting\advancements\recipes\building_blocks\edified_panel.json +a9111ff52513200af47b79cf98b2e545699497bb data\hexcasting\advancements\recipes\building_blocks\amethyst_tiles.json +ea63e49709bd80cb9f4cd1fe13e9bd0281101c9a data\hexcasting\recipes\slate.json +8e48c680b38666c2e7da71fbe4ceddf5d99a5cbc data\hexcasting\advancements\recipes\food\sub_sandwich.json +4d5e4a6374731b2d0a90c70a5d489703fd966977 data\hexcasting\advancements\recipes\misc\dye_colorizer_lime.json +7552df3fc726cc4cdaa88aa4823eff6ce069fb75 data\hexcasting\recipes\slate_block_from_slates.json +72f70637aea1c11683e9ee91d83c2807c6ec33a9 data\hexcasting\recipes\compat\farmersdelight\cutting\akashic_trapdoor.json +2cea013887734cbc4971bcd57e7e4f6a2b25c8e1 data\hexcasting\advancements\recipes\tools\focus.json +f1bae034d27d218bf262a8c777b787d232489f16 data\hexcasting\recipes\lens.json +963d87d2738686e5398a178b8b369228ff067403 data\hexcasting\recipes\spellbook.json +f0e71ae8c6a9170669f44096a55a875d11497c56 data\hexcasting\recipes\staff\warped.json +7c479398bbc7185a2c3efd568ad266d8109245bf data\hexcasting\advancements\recipes\redstone\edified_door.json +7baf0777533737aef68bcac36944943b77138d29 data\hexcasting\recipes\edified_button.json +daa7b13d5370f4306f8cdf3037fc346e8918950a data\hexcasting\recipes\dye_colorizer_brown.json +f08a0aee92b281ae325d907e6fe4a3b03980f2aa data\hexcasting\advancements\recipes\tools\staff\edified.json +61fafd43af83bdca6720d0993ab71f40a8bebd40 data\hexcasting\advancements\recipes\redstone\akashic_connector.json +00853ec1885c1f72674c07caf6fd04904e248f8f data\hexcasting\recipes\brainsweep\directrix_boolean.json +b90ad4cbffc2e3c01671dfe8bda5e42d9b8a685c data\hexcasting\advancements\recipes\tools\staff\crimson.json +ef96ae9709ec931ce6b6af8a539f9bc483236449 data\hexcasting\recipes\scroll_medium.json +552c235dc58a46a3e57913c9b9faf3f21abeae32 data\hexcasting\advancements\recipes\building_blocks\stripped_edified_wood.json +a0b87b1b21506708d09c9295b7afc13de6b1fce6 data\hexcasting\recipes\pride_colorizer_aromantic.json +ae88fcdecbfbdd0a0fe778467421a3b32d7ed735 data\create\recipes\crushing\amethyst_cluster.json +aa7558ec1baf6070efbe448d886e20e964e33f96 data\hexcasting\advancements\recipes\brainsweep\brainsweep\quench_allay.json +a8d604ba059d54502837809815d3ac9bbcaa89bf data\hexcasting\advancements\recipes\redstone\akashic_bookshelf.json +5889e2df2fb4e1ea29f2590b96bb3aa94961a09a data\hexcasting\recipes\scroll.json +0038883bd294cc8a1b324d6782478d5e37b4dbf9 data\hexcasting\advancements\recipes\misc\dye_colorizer_pink.json +71f821f5d24b0bf9ecd860d51e055628fe4af50c data\hexcasting\recipes\edified_panel.json +7e1a5a873d655e0efba80f22ae9b1de4f248e67a data\hexcasting\advancements\recipes\misc\decompose_quenched_shard\shard.json +417695497a95436186c1a4ed842d7975d754f9eb data\hexcasting\recipes\stripped_edified_wood.json +92bdf87687d8823036fae6bd01782c653831286b data\hexcasting\recipes\brainsweep\impetus_look.json +3608f0ec056f2c5d29a9a89305218497fd2c4383 data\hexcasting\recipes\stonecutting\amethyst_tiles.json +8815ea5d8d7379062e050adc5736cc579c3bdd9e data\hexcasting\recipes\edified_stairs.json +f482a4349786388cc8f11d5550548f7d60265438 data\hexcasting\recipes\staff\mangrove.json +6e2dc32f975d987b8dfd329507334f647bceadc0 data\hexcasting\advancements\recipes\tools\staff\mangrove.json +5a90084c03d6e8424872870c8b65f4771b447f03 data\hexcasting\recipes\brainsweep\budding_amethyst.json +2eacf53894ae97712dc3874777e29dce0a0e5540 data\hexcasting\advancements\recipes\misc\pride_colorizer_asexual.json +af9a260c24e0a65eea321f0dd9dd2fa7d648707f data\hexcasting\advancements\recipes\building_blocks\amethyst_dust_packing.json +24c244e53c7e47b85845d2ee36b1665410cf495a data\hexcasting\recipes\edified_planks.json +b84c113ef5321c9df9ac9080de03e8d8639feab2 data\hexcasting\advancements\recipes\misc\pride_colorizer_genderqueer.json +97062771a426f6e4b9e3bfd6daa62b1d4b3c7039 data\hexcasting\recipes\abacus.json +41a570f970c9af8229cb1140a11a5220fac00957 data\hexcasting\advancements\recipes\tools\staff\spruce.json +2c56c267e23e75d5a3b9358d424d69642e001b50 data\hexcasting\recipes\decompose_quenched_shard\dust.json +4003f297be29810cebde4995fb2838c2c68a25ea data\hexcasting\recipes\pride_colorizer_lesbian.json +5f216dbb7b89fd837e2dd73e3ed41c8d412de234 data\hexcasting\advancements\recipes\misc\decompose_quenched_shard\dust.json +648f1862fde1dd8ade80b2991b8c8e3991389e95 data\hexcasting\recipes\dye_colorizer_light_blue.json +fb486df96798724da2fcc0df5706f19bc1ff94dc data\hexcasting\advancements\recipes\misc\dye_colorizer_light_blue.json +946cde51bbfc2af344b078f6b39389ffc44462f4 data\hexcasting\advancements\recipes\brainsweep\brainsweep\impetus_storedplayer.json +0b951ce7b9d1bfb07ae012b12225b595d36c6e66 data\hexcasting\recipes\amethyst_dust_packing.json +838b91c33a72a58aa286607eaaa17cdd6b4c90ba data\hexcasting\recipes\amethyst_sconce.json +8f515bf8ccea70b3d88845ed83966dc0c66082f6 data\hexcasting\advancements\recipes\tools\staff\oak.json +0f2e63a9361d18aac764f6a4a4f13b9b862ac2ee data\hexcasting\recipes\compat\create\crushing\amethyst_shard.json +cedc2889c4f327b18755bbe8c3c595d302e2a9d0 data\hexcasting\recipes\decompose_quenched_shard\shard.json +2003fed3aa4eb622b6b07a9e65946fb40be14420 data\hexcasting\advancements\recipes\brainsweep\brainsweep\impetus_rightclick.json +7d71eb93bbb0856167cf4521283e39f0048078ee data\hexcasting\advancements\recipes\redstone\edified_button.json +0bd7c9f4a9bf29c1b63b2f9378f0a7e2f594b7b7 data\hexcasting\recipes\pride_colorizer_nonbinary.json +157ee5fba985bbd01a87f44578890dab5489a8e5 data\hexcasting\advancements\recipes\misc\dye_colorizer_green.json +c2ef04b311251b4eb22320b2f5313c54533a9974 data\hexcasting\advancements\recipes\tools\staff\birch.json +2fff80cd3dabd2bc1744eecd72b2364b0f91c7c1 data\hexcasting\advancements\recipes\misc\dye_colorizer_yellow.json +e536791d0c6fb48206e6e30d56879eaf0a9e4bd7 data\hexcasting\recipes\akashic_bookshelf.json +faaa9c39dbcdd131c5fbec9ac6a26d6dc5e72053 data\hexcasting\advancements\recipes\misc\dye_colorizer_light_gray.json +e0609202271e402d8ae58e4f8eaf11dcdda10a9e data\hexcasting\recipes\brainsweep\akashic_record.json +3bf96944a8eed8b8d3f5d96b609297727c078cb7 data\hexcasting\advancements\recipes\misc\dye_colorizer_purple.json +203b7035125390abb4ed77b3a4dca8f8f8f57bc5 data\hexcasting\recipes\dye_colorizer_light_gray.json +e691130641b11c0a030a51c71dee0ba356f3b5bd data\hexcasting\recipes\compat\farmersdelight\cutting\edified_log_aventurine.json +8f7b81add0153ad94900acc66cd8174ae7115f64 data\hexcasting\advancements\recipes\building_blocks\slate_block_from_slates.json +06402fb37fe4bb05918d13dbfdb89f4c2b67f3ec data\hexcasting\advancements\recipes\tools\cypher.json +c8f2ad363e4d20054f4e56fde02c8775a45a7169 data\hexcasting\recipes\artifact.json +8bea75fdc5e64c464dcf5f85166e767ff44e6dc2 data\hexcasting\advancements\recipes\misc\pride_colorizer_lesbian.json +c6228d72ca800a7dd336e82bbb9b4f20f89de29d data\hexcasting\advancements\recipes\redstone\edified_pressure_plate.json +0aaf55492e850d2bb1ec2f9986406ca61fde4cfd data\hexcasting\recipes\dye_colorizer_lime.json +e6a592721234448f2ee7ec402bca10a9b78b4677 data\hexcasting\advancements\recipes\decorations\slate.json +e9166f40c8797cdbf3d8062dfa35c74f850f1000 data\hexcasting\advancements\recipes\misc\dye_colorizer_white.json +2aa7d74e29a7c5ee4f1b8835cf7c6109eed81d77 data\hexcasting\recipes\brainsweep\quench_allay.json +f81053a3269c1b371be3f8057bad4803056ee0f9 data\hexcasting\recipes\dye_colorizer_orange.json +bc729ac7cf84d29a99cd34d50c152c0b9d20bd7a data\hexcasting\advancements\recipes\brainsweep\brainsweep\akashic_record.json +1a9dd55a24f56a4e9467f1117e0898f7e71ade67 data\hexcasting\advancements\recipes\decorations\amethyst_sconce.json +d7de5d626fd799a2522af36f0c62c52fe490e6d2 data\hexcasting\recipes\edified_door.json +c3f7b03fe184ed5e54a8ae06d130adf507b7683d data\hexcasting\recipes\staff\bamboo.json +6f2634e5588aede8e29157ecc859652d8a9f4065 data\hexcasting\advancements\recipes\misc\dye_colorizer_orange.json +b10d590e918e35b16578a8b739a1c4e7e2202e16 data\hexcasting\advancements\recipes\misc\dye_colorizer_cyan.json +0e792d49c81d2164e827d1bdedaa0fa358dfc437 data\hexcasting\advancements\recipes\misc\pride_colorizer_aromantic.json +afb422ad4a918ee0161bf077f09475bb1da2b4eb data\hexcasting\recipes\amethyst_dust_unpacking.json +011f8daf15148d4b77686c6d382d8f5c288a333d data\hexcasting\advancements\recipes\building_blocks\ancient_scroll_paper.json +98c0843e6a83b91820f1c720e206295eec20ff95 data\hexcasting\recipes\ancient_scroll_paper.json +9b7c5220fbaf3e84fa9e81eae322eed5d37b22d3 data\hexcasting\recipes\pride_colorizer_transgender.json +a1f9df0537c0ef33a1164cf94e8ff4b1094f889f data\hexcasting\advancements\recipes\tools\staff\warped.json +54335e0004423899ad37763a1d8456cc0a6e72a7 data\hexcasting\advancements\recipes\misc\decompose_quenched_shard\charged.json +641d8c38b8109665314fccbebd9068ba10b04118 data\hexcasting\advancements\recipes\misc\dye_colorizer_gray.json +5e98cec2084f0cfbb959c3ec39bd85a3369f443b data\hexcasting\advancements\recipes\tools\abacus.json +b300f7729e75614fce412457f6717686680f81da data\hexcasting\recipes\sub_sandwich.json +1a0d55e6824c078453c1d44e885a1c51ba707a41 data\hexcasting\recipes\dye_colorizer_white.json +36d26f34d0405ff2d1e728e5b5174502686e3590 data\hexcasting\advancements\recipes\brainsweep\brainsweep\budding_amethyst.json +903cbe4d4c4e5abcd5e006f9d0237e8c596228ba data\hexcasting\recipes\edified_tile.json +1093cccc6b1c45eb91f7c1680ef575a7bffb2744 data\hexcasting\advancements\recipes\building_blocks\edified_planks.json +233aeedc73173427e7b2287772a4f914f97b072c data\hexcasting\recipes\dye_colorizer_red.json +2a2f60fb0f63ee278b74c418acf04575304c521f data\hexcasting\advancements\recipes\tools\jeweler_hammer.json +004e0694b3bf53140be7df89a4defc255b800619 data\hexcasting\advancements\recipes\tools\focus_rotated.json +ea46e570a43cd3ea1cc78c51d9da45d93944730a data\hexcasting\advancements\recipes\redstone\directrix\empty.json +4d941fc399c6b7a470513a572ecd88982823da84 data\hexcasting\advancements\recipes\building_blocks\edified_wood.json +aa1caae7eba6aede0f179619488e2253b3b723dd data\hexcasting\recipes\focus_rotated.json +b1f8375aaf0d66035dee720ea59605f69fc0a154 data\hexcasting\recipes\edified_fence.json +1b092acfc3115702c74e141492e649d58512f259 data\hexcasting\recipes\staff\oak.json +0864e8b86bdad0bf9ab2ddeb0cd5a182808b5a0a data\hexcasting\recipes\default_colorizer.json +40ed21dc80d39236ca0e6d2cea60861c637cf931 data\hexcasting\advancements\recipes\misc\pride_colorizer_nonbinary.json +04902d4eca30560bc601a8196d82f74f3fa5b191 data\hexcasting\recipes\dynamicseal_spellbook.json +bd63b845e02ee4b1b9abe168a196335ccbed1ca5 data\hexcasting\recipes\scroll_paper_lantern.json +996c8361766377a70e0b5a5caff3076fc6031b0a data\hexcasting\recipes\impetus\empty.json +8b7136c206b799a2e394aa02316b0509674ff64f data\hexcasting\advancements\recipes\tools\staff\bamboo.json +c1541738df1ee41c362ad3b9c3a9f0e181bd5c62 data\hexcasting\recipes\pride_colorizer_plural.json +4a803e049915fd3c7144155ae3a1b05a917ea290 data\hexcasting\recipes\pride_colorizer_pansexual.json +71d38559bf455ea343ac0237a57db4d3f0833a7c data\hexcasting\advancements\recipes\misc\dye_colorizer_magenta.json +9ea4fe5272ce2241d98f30359f55cfc1936c7b48 data\hexcasting\advancements\recipes\tools\staff\cherry.json +72447ac69a0d85f91064180d3c852040a9e33832 data\hexcasting\recipes\pride_colorizer_asexual.json +a8cab28cffdf495253a320094d202fccc5aeb113 data\hexcasting\advancements\recipes\decorations\ancient_scroll_paper_lantern.json +14f3b217e150efbbff329d67aec96f818a1da99c data\hexcasting\recipes\dye_colorizer_purple.json +1e51cd4f527b3aea4d61d91829e47c191c9c05bb data\hexcasting\recipes\pride_colorizer_gay.json +f64fa00d85a9abb24e89b0d2c9f818001371f5e6 data\hexcasting\recipes\slate_block.json +a85cfbd7988f5df0b18d160591605aea8e6808d2 data\hexcasting\recipes\trinket.json +63189af501442318a90c16d6951e51c0c5d6d4f3 data\hexcasting\recipes\compat\farmersdelight\cutting\edified_log_purple.json +494aa470790ae46baebbf24ee5b76f5885c1af1a data\hexcasting\recipes\ageing_scroll_paper_lantern.json +bc8fe4d2f55fe119b0b146a71782a3d4788380b1 data\create\recipes\crushing\amethyst_block.json +7522be58b09554a3f1a54d5b2343c3eab01447a3 data\hexcasting\recipes\dye_colorizer_magenta.json +b624d103d944a8a1d4d8a9e85c198a5492b476f8 data\hexcasting\advancements\recipes\redstone\edified_trapdoor.json +a3130e3098e35b75afae4f31996d9ab7468e0bc3 data\hexcasting\advancements\recipes\tools\thought_knot.json +23eff6111b0385b66d3ad5fbabfc625f426517a6 data\hexcasting\advancements\recipes\brainsweep\brainsweep\directrix_redstone.json +c43fb770003c8d882fd9c1e7d1ecb5f196cba1ab data\hexcasting\recipes\cypher.json +2c292e12b5e85b1701740c222e5c5465799ad1dc data\hexcasting\recipes\pride_colorizer_aroace.json +dcc9bf721dd40724abcc69f1f7e8a1610dbf88f3 data\hexcasting\recipes\compat\farmersdelight\cutting\akashic_door.json +f77518b6993fe8e31de10af286c33ab72c0f9077 data\hexcasting\advancements\recipes\redstone\impetus\empty.json +93ed0491548920bc75797d18501c750ef07fe3ea data\hexcasting\advancements\recipes\misc\pride_colorizer_bisexual.json +27dc4a1647f264c45b27f5552fd9403a02853484 data\hexcasting\advancements\recipes\tools\spellbook.json +7166cd4355d11c209bc7749bc862caddcfd795fb data\hexcasting\recipes\dye_colorizer_cyan.json +b6720c1c73455ad817bac9b5ca2ca045c5c4050c data\hexcasting\recipes\pride_colorizer_agender.json +ed5c690324e3d9b55599f00f078ae225072a2e7f data\hexcasting\recipes\brainsweep\impetus_rightclick.json +c4b985635c3b1a519d7a83da65daba5bdd3a5f59 data\hexcasting\advancements\recipes\decorations\ageing_scroll_paper_lantern.json +846baaef37844216b57bb9b35e52b1bb6b56b413 data\hexcasting\advancements\recipes\decorations\scroll_small.json +441f336edb635e5d8c2a7183906fed1c501f06fd data\hexcasting\recipes\pride_colorizer_bisexual.json +f80dbf59957be175fbcd63224005e09c4cd1a122 data\hexcasting\recipes\compat\farmersdelight\cutting\edified_log_citrine.json +a72a0fcc0f3a81d31b30a7a626aef537796ca73b data\hexcasting\advancements\recipes\tools\staff\quenched.json +8f8773a541bc6a4a6c55a23f4f98b5da4f61a031 data\hexcasting\recipes\scroll_paper.json +4680e9dafcf9b60b3485609519d66eefcfd539bc data\hexcasting\recipes\staff\dark_oak.json +77369113dc54d1c64b9101861dd8a1930bf1c1c4 data\hexcasting\recipes\edified_wood.json +45915b542d8070f2502a4047218679b08033b12d data\hexcasting\advancements\recipes\decorations\scroll_paper_lantern.json +a366ea3750adc0d336ab8f318c40baed3f9c3eb7 data\hexcasting\recipes\brainsweep\impetus_storedplayer.json +151875101066f7af5788c7a2e1c6b342971a546a data\hexcasting\recipes\compat\farmersdelight\cutting\akashic_wood.json +b94bc4dd4a63db10af86c524ba00eae157c1824b data\hexcasting\advancements\recipes\building_blocks\edified_fence_gate.json +c2a0a489967db4064dfbe1ee6367e132665f3c00 data\hexcasting\recipes\edified_slab.json +5e28e2c352366720ce91b73f8c8c38e217f7198d data\hexcasting\recipes\edified_fence_gate.json +6493676f8ca93a7be8d70e25d69ddad935b3f16b data\hexcasting\advancements\recipes\tools\lens.json +b5946314683e5a823b577a18d13fb437a35aafd5 data\hexcasting\recipes\decompose_quenched_shard\charged.json +c03c81dc123294472e8bb6f836c319e96f8db4f5 data\hexcasting\advancements\recipes\building_blocks\edified_fence.json +b29f9d9c14e60ded1148680e2e0ef405b5a3c845 data\hexcasting\advancements\recipes\misc\uuid_colorizer.json +78958099bf4337ad281580d90f434b3074ad18c8 data\hexcasting\recipes\pride_colorizer_genderqueer.json +0b172aef920da7ba63fe152903ce005c1f5df5f1 data\hexcasting\recipes\staff\acacia.json +31ec6474ddae967a6c1dadf9be8292d375510364 data\hexcasting\advancements\recipes\building_blocks\edified_tile.json +d47352426739a0fc500a385d820d767a307e1d16 data\hexcasting\advancements\recipes\misc\dye_colorizer_black.json +095aeb2882c6849f10fb6536e7c780790778e5e7 data\hexcasting\recipes\staff\jungle.json +923e7cd200518042f11474713eca9ccad126dab7 data\hexcasting\recipes\staff\spruce.json +fd7c8325fcaa6a718e90c09251b447fb365523d4 data\hexcasting\recipes\pride_colorizer_demiboy.json +2b64261bd4aefdc55d35400f25835434f88856cf data\hexcasting\recipes\amethyst_tiles.json +12bd3d04c791ef16aad5e992f038d6726229a436 data\hexcasting\advancements\recipes\tools\artifact.json +de38d15e7a91c77df24c1dc954b3e98ee197876f data\hexcasting\recipes\focus.json +fd2f25b0a71806c96af5a307fad76f66de6210a4 data\hexcasting\advancements\recipes\building_blocks\slate_block.json +1ad54df5eaee3d1e810d2c91bd03f626084e30b6 data\hexcasting\recipes\edified_trapdoor.json +4aaefc65af5fe69d312247fdda7d983edf8dcd9a data\hexcasting\recipes\pride_colorizer_intersex.json +b20be6eb5a8b60567871444e65d773ec9a67ece1 data\hexcasting\recipes\staff\crimson.json +775560efa36581389c0319435bda035be262ed4f data\hexcasting\advancements\recipes\building_blocks\edified_stairs.json +ce9d0b976f7cc8ad4a0815bbea6c43115addb90f data\hexcasting\advancements\recipes\building_blocks\scroll_paper.json +db5ae3a2fda235cf1c83fd83e0026a262e668217 data\hexcasting\advancements\recipes\building_blocks\edified_slab.json +06ca609ba1a32f094cf6edbc989bc9ddaf9d342c data\hexcasting\advancements\recipes\misc\pride_colorizer_genderfluid.json +af8fe74b624df4a31727347b9826614a66092b0a data\hexcasting\advancements\recipes\misc\pride_colorizer_agender.json +664ce1a38c9b1c9ec21b7e078631e181fc0b2498 data\hexcasting\recipes\staff\edified.json +b6e762c198b9632defd7f8b11287702abecd681d data\hexcasting\recipes\staff\mindsplice.json +5401828f85e709b5817ecc8464dc63e536a730dc data\hexcasting\recipes\staff\cherry.json +51b047601368a103be166d907633b196d2d8a4e8 data\hexcasting\recipes\compat\farmersdelight\cutting\edified_log.json +42b8e462de1d7006de3a7658757377450e773107 data\hexcasting\advancements\recipes\misc\dye_colorizer_blue.json +499c5c09e3772989350f9ab3264b8692449a6dea data\hexcasting\advancements\recipes\misc\pride_colorizer_gay.json +30352d8ad510768770bb1b2d378959b7a502f825 data\hexcasting\advancements\recipes\brainsweep\brainsweep\impetus_look.json +6ed61e03c51dc653cd66e643a6d33fe9105ff171 data\hexcasting\advancements\recipes\brainsweep\brainsweep\directrix_boolean.json +0ead307e47242ba140584f6bd20088a1fa7c2909 data\hexcasting\recipes\directrix\empty.json +68ab70e0b4e432a3492767c5597ecd836f106714 data\hexcasting\advancements\recipes\tools\staff\mindsplice.json +5fab1b9c93304a53a4c305b511704458e4593444 data\hexcasting\recipes\pride_colorizer_demigirl.json +170af3c83a45f9550827cc48e4bb5a621d06d685 data\hexcasting\advancements\recipes\misc\pride_colorizer_transgender.json +7f2f29981df2ca4464ee0250180e670f5331f65b data\hexcasting\recipes\dye_colorizer_pink.json +61e53f02baefd31308e99407d56403dfc18e36e1 data\hexcasting\recipes\akashic_connector.json +7aa3bf4a3d6fb92743b29dfe89d50537fefc0db9 data\hexcasting\advancements\recipes\misc\pride_colorizer_intersex.json +eb9ebf77f0daa32f665a60888fcda19c940f0b2f data\hexcasting\advancements\recipes\misc\pride_colorizer_demigirl.json +410bfde90cb977db3f13814e94484fa11fca7cfc data\hexcasting\recipes\thought_knot.json +55ea553a96e1d6a54385890f7c48fe7b2bed6871 data\hexcasting\advancements\recipes\tools\trinket.json +e765ee2bd324240e8ed3d625be431de3281f0070 data\hexcasting\recipes\dye_colorizer_gray.json +ad647a2078099344ea7f9836a68e1bf8e8119277 data\hexcasting\advancements\recipes\misc\dye_colorizer_brown.json +8c043c7f6a7911b67324e2fd42f0b3b19a792af3 data\hexcasting\recipes\ancient_scroll_paper_lantern.json diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java index a49ab760f3..0b5bc27663 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -15,6 +15,7 @@ import me.shedaniel.autoconfig.serializer.PartitioningSerializer; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; @@ -135,6 +136,8 @@ public static final class Client implements HexConfig.ClientConfigAccess, Config private double gridSnapThreshold = DEFAULT_GRID_SNAP_THRESHOLD; @ConfigEntry.Gui.Tooltip private boolean clickingTogglesDrawing = DEFAULT_CLICKING_TOGGLES_DRAWING; + @ConfigEntry.Gui.Tooltip + private boolean alwaysShowListCommas = DEFAULT_ALWAYS_SHOW_LIST_COMMAS; @Override public void validatePostLoad() throws ValidationException { @@ -165,6 +168,11 @@ public double gridSnapThreshold() { public boolean clickingTogglesDrawing() { return clickingTogglesDrawing; } + + @Override + public boolean alwaysShowListCommas() { + return alwaysShowListCommas; + } } @Config(name = "server") @@ -184,10 +192,11 @@ public static final class Server implements HexConfig.ServerConfigAccess, Config private boolean villagersOffendedByMindMurder = DEFAULT_VILLAGERS_DISLIKE_MIND_MURDER; @ConfigEntry.Gui.Tooltip private boolean doesTrueNameHaveAmbit = DEFAULT_TRUE_NAME_HAS_AMBIT; - - @ConfigEntry.Gui.Tooltip private List tpDimDenylist = DEFAULT_DIM_TP_DENYLIST; + + @ConfigEntry.Gui.Tooltip + private double traderScrollChance = DEFAULT_TRADER_SCROLL_CHANCE; // ModMenu bad and doesn't like java objects in here so we do stupid string parsing @ConfigEntry.Gui.Tooltip @@ -209,6 +218,18 @@ public static final class Server implements HexConfig.ServerConfigAccess, Config @ConfigEntry.Gui.Tooltip private double loreChance = HexLootHandler.DEFAULT_LORE_CHANCE; + @ConfigEntry.Gui.Tooltip + private List cypherInjectionsRaw = HexLootHandler.DEFAULT_CYPHER_INJECTS + .stream() + .map(ResourceLocation::toString) + .toList(); + @ConfigEntry.Gui.Excluded + private transient List cypherInjections; + @ConfigEntry.Gui.Tooltip + private double cypherChance = HexLootHandler.DEFAULT_CYPHER_CHANCE; + @ConfigEntry.Gui.Tooltip + private List> lootHexList = HexLootHandler.DEFAULT_LOOT_HEXES; + @Override public void validatePostLoad() throws ValidationException { @@ -239,6 +260,18 @@ public void validatePostLoad() throws ValidationException { } this.loreChance = Mth.clamp(this.loreChance, 0.0, 1.0); + + this.cypherInjections = new ArrayList<>(); + try { + for (var table : this.cypherInjectionsRaw) { + ResourceLocation loc = new ResourceLocation(table); + this.cypherInjections.add(loc); + } + } catch (Exception e) { + throw new ValidationException("Bad parsing of cypher injects", e); + } + + this.cypherChance = Mth.clamp(this.cypherChance, 0.0, 1.0); } @Override @@ -281,6 +314,10 @@ public boolean trueNameHasAmbit() { return doesTrueNameHaveAmbit; } + public double traderScrollChance() { + return traderScrollChance; + } + /** * Returns -1 if none is found */ @@ -292,8 +329,21 @@ public boolean shouldInjectLore(ResourceLocation lootTable) { return anyMatchResLoc(this.loreInjections, lootTable); } - public double getLoreChance() { + public double loreChance() { return loreChance; } + + public boolean shouldInjectCyphers(ResourceLocation lootTable) { + return anyMatchResLoc(this.cypherInjections, lootTable); + } + + public double cypherChance() { + return cypherChance; + } + + public List getRandomLootHex(RandomSource rand) { + var index = rand.nextInt(this.lootHexList.size()); + return this.lootHexList.get(index); + } } } diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/loot/FabricHexLootModJankery.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/loot/FabricHexLootModJankery.java index 5aadc8df41..2cc402058f 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/loot/FabricHexLootModJankery.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/loot/FabricHexLootModJankery.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; +import at.petrak.hexcasting.common.loot.AddHexToAncientCypherFunc; import at.petrak.hexcasting.fabric.FabricHexInitializer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Blocks; @@ -21,10 +22,18 @@ public class FabricHexLootModJankery { public static final ResourceLocation FUNC_AMETHYST_SHARD_REDUCER = modLoc("amethyst_shard_reducer"); + public static final ResourceLocation RANDOM_SCROLL_TABLE = modLoc("random_scroll"); + public static final ResourceLocation RANDOM_CYPHER_TABLE = modLoc("random_cypher"); public static void lootLoad(ResourceLocation id, Consumer addPool) { if (id.equals(Blocks.AMETHYST_CLUSTER.getLootTable())) { addPool.accept(makeAmethystInjectPool()); + } else if (id.equals(RANDOM_SCROLL_TABLE)) { + // -1 weight = guaranteed spawn + addPool.accept(makeScrollAddPool(-1)); + } else if (id.equals(RANDOM_CYPHER_TABLE)) { + // 1 chance = guaranteed spawn + addPool.accept(makeCypherAddPool(1)); } int countRange = FabricHexInitializer.CONFIG.server.scrollRangeForLootTable(id); @@ -33,7 +42,11 @@ public static void lootLoad(ResourceLocation id, Consumer addP } if (FabricHexInitializer.CONFIG.server.shouldInjectLore(id)) { - addPool.accept(makeLoreAddPool(FabricHexInitializer.CONFIG.server.getLoreChance())); + addPool.accept(makeLoreAddPool(FabricHexInitializer.CONFIG.server.loreChance())); + } + + if (FabricHexInitializer.CONFIG.server.shouldInjectCyphers(id)) { + addPool.accept(makeCypherAddPool(FabricHexInitializer.CONFIG.server.cypherChance())); } } @@ -45,7 +58,7 @@ private static LootPool.Builder makeAmethystInjectPool() { private static LootPool.Builder makeScrollAddPool(int range) { return LootPool.lootPool() - .setRolls(UniformGenerator.between(-range, range)) + .setRolls(range < 0 ? ConstantValue.exactly(1) : UniformGenerator.between(-range, range)) .add(LootItem.lootTableItem(HexItems.SCROLL_LARGE)) .apply(() -> new AddPerWorldPatternToScrollFunc(new LootItemCondition[0])); } @@ -56,4 +69,12 @@ private static LootPool.Builder makeLoreAddPool(double chance) { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(HexItems.LORE_FRAGMENT)); } + + private static LootPool.Builder makeCypherAddPool(double chance) { + return LootPool.lootPool() + .when(LootItemRandomChanceCondition.randomChance((float) chance)) + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(HexItems.ANCIENT_CYPHER)) + .apply(() -> new AddHexToAncientCypherFunc(new LootItemCondition[0])); + } } diff --git a/Forge/src/generated/resources/.cache/d4b3e6634c30118e1127c02b727ea285752e5aac b/Forge/src/generated/resources/.cache/d4b3e6634c30118e1127c02b727ea285752e5aac index c5701d8cb7..7e9cc6b47f 100644 --- a/Forge/src/generated/resources/.cache/d4b3e6634c30118e1127c02b727ea285752e5aac +++ b/Forge/src/generated/resources/.cache/d4b3e6634c30118e1127c02b727ea285752e5aac @@ -1,6 +1,14 @@ -// 1.20.1 2023-12-24T17:58:56.8940231 Global Loot Modifiers : hexcasting -fcf77123631746f3ee4e815183c0731c3ec206c9 data/forge/loot_modifiers/global_loot_modifiers.json +// 1.20.1 2024-12-11T19:01:35.255688 Global Loot Modifiers : hexcasting +aea957ba78a93cace2c9959df83ed396b66d732f data/forge/loot_modifiers/global_loot_modifiers.json 28ca895a27221312c2451f26646111a68aadbf6c data/hexcasting/loot_modifiers/amethyst_cluster.json +5dd05e6f8f0e406b529bc209b393410553584fdf data/hexcasting/loot_modifiers/cypher/hexcasting/random_cypher.json +009da1f70c3aaaa4f8474eb08217821638d8c02c data/hexcasting/loot_modifiers/cypher/minecraft/chests/abandoned_mineshaft.json +27481d7099d4914cd97e4ed7da8fd69327bb376a data/hexcasting/loot_modifiers/cypher/minecraft/chests/ancient_city.json +9cc4deb22f8d70d600587a48f2a1243a8040cb94 data/hexcasting/loot_modifiers/cypher/minecraft/chests/desert_pyramid.json +1cd1a2c1276ade2d4141ee9b698948ba38e8c7ae data/hexcasting/loot_modifiers/cypher/minecraft/chests/jungle_temple.json +a76a565a7d4fb07e4a713b1f9ef021e729ed69bb data/hexcasting/loot_modifiers/cypher/minecraft/chests/nether_bridge.json +e8d2d9f35be1e4561b28f0bff9811cf1e68befe9 data/hexcasting/loot_modifiers/cypher/minecraft/chests/simple_dungeon.json +e1e5e0b90c5ccebd817d6983f671a5197f349e4b data/hexcasting/loot_modifiers/cypher/minecraft/chests/stronghold_corridor.json f98707c91dc8712409833df1e5da245e9b14ebfa data/hexcasting/loot_modifiers/lore/minecraft/chests/abandoned_mineshaft.json 16b4bbb5358f2fcad31a8b796cdc3eef28caaf09 data/hexcasting/loot_modifiers/lore/minecraft/chests/pillager_outpost.json 6d6a9fd35a8f4e94c7ae64bf8c130b40d0d7d0e4 data/hexcasting/loot_modifiers/lore/minecraft/chests/simple_dungeon.json @@ -11,6 +19,7 @@ d1b282c57a8f5d1a37f3b87fbdba408b2a1b1415 data/hexcasting/loot_modifiers/lore/min e52b9cba9d685a2ca7ea7db629c7c0990f12be26 data/hexcasting/loot_modifiers/lore/minecraft/chests/village/village_snowy_house.json a59a9c55b02b76c0e3f6a2ee4fa7bcf3ab538595 data/hexcasting/loot_modifiers/lore/minecraft/chests/village/village_taiga_house.json 348688be7af2a3ea62c605428c958e62e449252d data/hexcasting/loot_modifiers/lore/minecraft/chests/woodland_mansion.json +479260c4206a3f664f5077a7c43e3ac93e3fdc87 data/hexcasting/loot_modifiers/scroll/hexcasting/random_scroll.json a89a9e3113b83c6eb978f101aad42a6b37e7c1d8 data/hexcasting/loot_modifiers/scroll/minecraft/chests/abandoned_mineshaft.json bfac0ff9e84cd974ccfb47edc9dce78476470103 data/hexcasting/loot_modifiers/scroll/minecraft/chests/ancient_city.json 0fcb299789a1b0162ab81a025a06b1aab5eb504b data/hexcasting/loot_modifiers/scroll/minecraft/chests/bastion_other.json diff --git a/Forge/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json b/Forge/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json index 978f1f8d21..5c64c0663d 100644 --- a/Forge/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json +++ b/Forge/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json @@ -3,27 +3,36 @@ "hexcasting:scroll/minecraft/chests/nether_bridge", "hexcasting:scroll/minecraft/chests/village/village_cartographer", "hexcasting:lore/minecraft/chests/village/village_taiga_house", + "hexcasting:cypher/minecraft/chests/ancient_city", + "hexcasting:cypher/minecraft/chests/jungle_temple", "hexcasting:scroll/minecraft/chests/shipwreck_map", "hexcasting:lore/minecraft/chests/village/village_snowy_house", "hexcasting:scroll/minecraft/chests/abandoned_mineshaft", + "hexcasting:cypher/minecraft/chests/simple_dungeon", + "hexcasting:cypher/minecraft/chests/desert_pyramid", "hexcasting:amethyst_cluster", "hexcasting:lore/minecraft/chests/village/village_plains_house", "hexcasting:lore/minecraft/chests/stronghold_library", "hexcasting:scroll/minecraft/chests/bastion_other", "hexcasting:lore/minecraft/chests/woodland_mansion", + "hexcasting:scroll/hexcasting/random_scroll", "hexcasting:lore/minecraft/chests/village/village_desert_house", "hexcasting:scroll/minecraft/chests/end_city_treasure", "hexcasting:scroll/minecraft/chests/jungle_temple", "hexcasting:scroll/minecraft/chests/bastion_treasure", + "hexcasting:cypher/hexcasting/random_cypher", "hexcasting:lore/minecraft/chests/village/village_savanna_house", "hexcasting:scroll/minecraft/chests/pillager_outpost", "hexcasting:scroll/minecraft/chests/desert_pyramid", "hexcasting:lore/minecraft/chests/abandoned_mineshaft", "hexcasting:lore/minecraft/chests/pillager_outpost", + "hexcasting:cypher/minecraft/chests/stronghold_corridor", "hexcasting:scroll/minecraft/chests/ancient_city", "hexcasting:scroll/minecraft/chests/stronghold_library", "hexcasting:lore/minecraft/chests/simple_dungeon", + "hexcasting:cypher/minecraft/chests/abandoned_mineshaft", "hexcasting:scroll/minecraft/chests/woodland_mansion", + "hexcasting:cypher/minecraft/chests/nether_bridge", "hexcasting:scroll/minecraft/chests/simple_dungeon" ], "replace": false diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/hexcasting/random_cypher.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/hexcasting/random_cypher.json new file mode 100644 index 0000000000..e5586b3adb --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/hexcasting/random_cypher.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 1.0, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "hexcasting:random_cypher" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/abandoned_mineshaft.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/abandoned_mineshaft.json new file mode 100644 index 0000000000..11a24e5644 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/abandoned_mineshaft.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/abandoned_mineshaft" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/ancient_city.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/ancient_city.json new file mode 100644 index 0000000000..5be9854194 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/ancient_city.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/ancient_city" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/desert_pyramid.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/desert_pyramid.json new file mode 100644 index 0000000000..202e48915f --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/desert_pyramid.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/desert_pyramid" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/jungle_temple.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/jungle_temple.json new file mode 100644 index 0000000000..20c453b205 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/jungle_temple.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/jungle_temple" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/nether_bridge.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/nether_bridge.json new file mode 100644 index 0000000000..abc331648e --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/nether_bridge.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/nether_bridge" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/simple_dungeon.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/simple_dungeon.json new file mode 100644 index 0000000000..d792919658 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/simple_dungeon.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/simple_dungeon" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/stronghold_corridor.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/stronghold_corridor.json new file mode 100644 index 0000000000..e8d6069ad3 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/cypher/minecraft/chests/stronghold_corridor.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_cyphers", + "chance": 0.4, + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "minecraft:chests/stronghold_corridor" + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/loot_modifiers/scroll/hexcasting/random_scroll.json b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/scroll/hexcasting/random_scroll.json new file mode 100644 index 0000000000..742f92dfd9 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/loot_modifiers/scroll/hexcasting/random_scroll.json @@ -0,0 +1,10 @@ +{ + "type": "hexcasting:inject_scrolls", + "conditions": [ + { + "condition": "forge:loot_table_id", + "loot_table_id": "hexcasting:random_scroll" + } + ], + "countRange": -1 +} \ No newline at end of file diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java index bf219312fc..70d46b1cba 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -1,10 +1,12 @@ package at.petrak.hexcasting.forge; import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.common.loot.HexLootHandler; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraft.util.RandomSource; import java.util.List; @@ -83,6 +85,7 @@ public static class Client implements HexConfig.ClientConfigAccess { private static ForgeConfigSpec.BooleanValue invertAbacusScrollDirection; private static ForgeConfigSpec.DoubleValue gridSnapThreshold; private static ForgeConfigSpec.BooleanValue clickingTogglesDrawing; + private static ForgeConfigSpec.BooleanValue alwaysShowListCommas; public Client(ForgeConfigSpec.Builder builder) { ctrlTogglesOffStrokeOrder = builder.comment( @@ -102,6 +105,9 @@ public Client(ForgeConfigSpec.Builder builder) { clickingTogglesDrawing = builder.comment( "Whether you click to start and stop drawing instead of clicking and dragging") .define("clickingTogglesDrawing", DEFAULT_CLICKING_TOGGLES_DRAWING); + alwaysShowListCommas = builder.comment( + "Whether all iota types should be comma-separated in lists (by default, pattern iotas don't use commas)") + .define("alwaysShowListCommas", DEFAULT_ALWAYS_SHOW_LIST_COMMAS); } @Override @@ -128,26 +134,25 @@ public double gridSnapThreshold() { public boolean clickingTogglesDrawing() { return clickingTogglesDrawing.get(); } + + @Override + public boolean alwaysShowListCommas() { + return alwaysShowListCommas.get(); + } } public static class Server implements HexConfig.ServerConfigAccess { private static ForgeConfigSpec.IntValue opBreakHarvestLevel; private static ForgeConfigSpec.IntValue maxOpCount; - private static ForgeConfigSpec.IntValue maxSpellCircleLength; - private static ForgeConfigSpec.ConfigValue> actionDenyList; private static ForgeConfigSpec.ConfigValue> circleActionDenyList; - private static ForgeConfigSpec.BooleanValue villagersOffendedByMindMurder; - private static ForgeConfigSpec.ConfigValue> tpDimDenyList; - private static ForgeConfigSpec.BooleanValue doesTrueNameHaveAmbit; - - private static ForgeConfigSpec.ConfigValue> fewScrollTables; - private static ForgeConfigSpec.ConfigValue> someScrollTables; - private static ForgeConfigSpec.ConfigValue> manyScrollTables; + private static ForgeConfigSpec.DoubleValue traderScrollChance; + // scroll/lore/cypher pools and chances should go here + private static ForgeConfigSpec.ConfigValue>> lootHexList; public Server(ForgeConfigSpec.Builder builder) { @@ -171,6 +176,18 @@ public Server(ForgeConfigSpec.Builder builder) { .defineList("circleActionDenyList", List.of(), Server::isValidReslocArg); builder.pop(); + builder.push("Loot"); + traderScrollChance = builder.comment("The chance for wandering traders to sell an Ancient Scroll") + .defineInRange("traderScrollChance", DEFAULT_TRADER_SCROLL_CHANCE, 0.0, 1.0); + + // builders for scroll/lore/cypher pools and chances should go here + + lootHexList = builder.comment( + "List of preset hexes found in loot cyphers. First element is the name, other elements are the patterns." + + "The default names use hardcoded translation keys, but custom ones should be human-readable.") + .defineList("lootHexList", HexLootHandler.DEFAULT_LOOT_HEXES, Server::isValidReslocArg); + builder.pop(); + actionDenyList = builder.comment( "Resource locations of disallowed actions. Trying to cast one of these will result in a mishap.") .defineList("actionDenyList", List.of(), Server::isValidReslocArg); @@ -183,7 +200,7 @@ public Server(ForgeConfigSpec.Builder builder) { .defineList("tpDimDenyList", DEFAULT_DIM_TP_DENYLIST, Server::isValidReslocArg); doesTrueNameHaveAmbit = builder.comment( - "when false makes player reference iotas behave as normal entity reference iotas") + "When false, makes player reference iotas behave as normal entity reference iotas") .define("doesTrueNameHaveAmbit", DEFAULT_TRUE_NAME_HAS_AMBIT); } @@ -227,6 +244,17 @@ public boolean trueNameHasAmbit() { return doesTrueNameHaveAmbit.get(); } + @Override + public double traderScrollChance() { + return traderScrollChance.get(); + } + + @Override + public List getRandomLootHex(RandomSource rand) { + var index = rand.nextInt(lootHexList.get().size()); + return lootHexList.get().get(index); + } + private static boolean isValidReslocArg(Object o) { return o instanceof String s && ResourceLocation.isValidResourceLocation(s); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java index d1a85e93e7..521996ab29 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java @@ -5,13 +5,20 @@ import at.petrak.hexcasting.forge.loot.ForgeHexAmethystLootMod; import at.petrak.hexcasting.forge.loot.ForgeHexLoreLootMod; import at.petrak.hexcasting.forge.loot.ForgeHexScrollLootMod; +import at.petrak.hexcasting.forge.loot.ForgeHexCypherLootMod; import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraftforge.common.data.GlobalLootModifierProvider; import net.minecraftforge.common.loot.LootTableIdCondition; +import static at.petrak.hexcasting.api.HexAPI.modLoc; + public class ForgeHexLootModGen extends GlobalLootModifierProvider { + public static final ResourceLocation RANDOM_SCROLL_TABLE = modLoc("random_scroll"); + public static final ResourceLocation RANDOM_CYPHER_TABLE = modLoc("random_cypher"); + public ForgeHexLootModGen(PackOutput output) { super(output, HexAPI.MOD_ID); } @@ -28,13 +35,27 @@ protected void start() { for (var injection : HexLootHandler.DEFAULT_LORE_INJECTS) { var name = "lore/%s/%s".formatted(injection.getNamespace(), injection.getPath()); add(name, new ForgeHexLoreLootMod(new LootItemCondition[]{ - LootTableIdCondition.builder(injection).build(), + LootTableIdCondition.builder(injection).build() }, HexLootHandler.DEFAULT_LORE_CHANCE)); } + for (var injection : HexLootHandler.DEFAULT_CYPHER_INJECTS) { + var name = "cypher/%s/%s".formatted(injection.getNamespace(), injection.getPath()); + add(name, new ForgeHexCypherLootMod(new LootItemCondition[]{ + LootTableIdCondition.builder(injection).build() + }, HexLootHandler.DEFAULT_CYPHER_CHANCE)); + } + + add("scroll/hexcasting/random_scroll", new ForgeHexScrollLootMod(new LootItemCondition[]{ + LootTableIdCondition.builder(RANDOM_SCROLL_TABLE).build() + }, -1)); // -1 weight = guaranteed spawn + + add("cypher/hexcasting/random_cypher", new ForgeHexCypherLootMod(new LootItemCondition[]{ + LootTableIdCondition.builder(RANDOM_CYPHER_TABLE).build() + }, 1)); // 1 chance = guaranteed spawn + add("amethyst_cluster", new ForgeHexAmethystLootMod(new LootItemCondition[]{ LootTableIdCondition.builder(Blocks.AMETHYST_CLUSTER.getLootTable()).build() }, HexLootHandler.DEFAULT_SHARD_MODIFICATION)); - } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index 7def15a4e4..f8a988459f 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -119,6 +119,7 @@ protected void registerModels() { buildSealableIotaHolder(HexItems.FOCUS, "focus", HexItems.FOCUS.numVariants()); buildSealableIotaHolder(HexItems.SPELLBOOK, "spellbook", HexItems.SPELLBOOK.numVariants()); + buildPackagedSpell(HexItems.ANCIENT_CYPHER, "ancient_cypher", HexItems.ANCIENT_CYPHER.numVariants()); buildPackagedSpell(HexItems.CYPHER, "cypher", HexItems.CYPHER.numVariants()); buildPackagedSpell(HexItems.TRINKET, "trinket", HexItems.TRINKET.numVariants()); buildPackagedSpell(HexItems.ARTIFACT, "artifact", HexItems.ARTIFACT.numVariants()); diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java index a967358df2..7581f6aaab 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.forge.loot.ForgeHexAmethystLootMod; import at.petrak.hexcasting.forge.loot.ForgeHexLoreLootMod; import at.petrak.hexcasting.forge.loot.ForgeHexScrollLootMod; +import at.petrak.hexcasting.forge.loot.ForgeHexCypherLootMod; import com.mojang.serialization.Codec; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.registries.DeferredRegister; @@ -18,6 +19,8 @@ public class ForgeHexLootMods { "inject_scrolls", ForgeHexScrollLootMod.CODEC); public static final RegistryObject> INJECT_LORE = REGISTRY.register( "inject_lore", ForgeHexLoreLootMod.CODEC); + public static final RegistryObject> INJECT_CYPHERS = REGISTRY.register( + "inject_cyphers", ForgeHexCypherLootMod.CODEC); public static final RegistryObject> AMETHYST = REGISTRY.register( "amethyst_cluster", ForgeHexAmethystLootMod.CODEC); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java new file mode 100644 index 0000000000..385bf4a64e --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java @@ -0,0 +1,48 @@ +package at.petrak.hexcasting.forge.loot; + +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.common.loot.AddHexToAncientCypherFunc; +import at.petrak.hexcasting.forge.lib.ForgeHexLootMods; +import com.google.common.base.Suppliers; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraftforge.common.loot.LootModifier; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Supplier; + +public class ForgeHexCypherLootMod extends LootModifier { + public static final Supplier> CODEC = + Suppliers.memoize(() -> RecordCodecBuilder.create( + inst -> codecStart(inst).and( + Codec.DOUBLE.fieldOf("chance").forGetter(it -> it.chance) + ).apply(inst, ForgeHexCypherLootMod::new) + )); + + public final double chance; + + public ForgeHexCypherLootMod(LootItemCondition[] conditionsIn, double chance) { + super(conditionsIn); + this.chance = chance; + } + + @Override + protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, + LootContext context) { + if (context.getRandom().nextDouble() < this.chance) { + var newStack = new ItemStack(HexItems.ANCIENT_CYPHER); + AddHexToAncientCypherFunc.doStatic(newStack, context.getRandom()); + generatedLoot.add(newStack); + } + return generatedLoot; + } + + @Override + public Codec codec() { + return ForgeHexLootMods.INJECT_CYPHERS.get(); + } +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java index ffae0a85ce..114a19b2b5 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java @@ -24,7 +24,7 @@ public class ForgeHexScrollLootMod extends LootModifier { Codec.INT.fieldOf("countRange").forGetter(it -> it.countRange) ).apply(inst, ForgeHexScrollLootMod::new) )); - + public final int countRange; public ForgeHexScrollLootMod(LootItemCondition[] conditionsIn, int countRange) { @@ -35,10 +35,10 @@ public ForgeHexScrollLootMod(LootItemCondition[] conditionsIn, int countRange) { @Override protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { - int count = HexLootHandler.getScrollCount(this.countRange, context.getRandom()); + var count = this.countRange < 0 ? 1 : HexLootHandler.getScrollCount(this.countRange, context.getRandom()); for (int i = 0; i < count; i++) { var newStack = new ItemStack(HexItems.SCROLL_LARGE); - AddPerWorldPatternToScrollFunc.doStatic(newStack, context); + AddPerWorldPatternToScrollFunc.doStatic(newStack, context.getRandom(), context.getLevel().getServer().overworld()); generatedLoot.add(newStack); } return generatedLoot;