From b4f305ec4b938a7cd79dca03f58abe66a3fc03f9 Mon Sep 17 00:00:00 2001 From: object-Object Date: Sat, 2 Sep 2023 00:41:29 -0400 Subject: [PATCH] Re-add 0.10.3 support --- .vscode/launch.json | 2 +- 0.10.3/Common/build.gradle | 60 + .../blockstates/akashic_bookshelf.json | 107 ++ .../blockstates/akashic_connector.json | 7 + .../blockstates/akashic_record.json | 7 + .../blockstates/amethyst_dust_block.json | 7 + .../blockstates/amethyst_edified_leaves.json | 7 + .../blockstates/amethyst_sconce.json | 7 + .../blockstates/amethyst_tiles.json | 7 + .../blockstates/ancient_scroll_paper.json | 7 + .../ancient_scroll_paper_lantern.json | 7 + .../aventurine_edified_leaves.json | 7 + .../blockstates/citrine_edified_leaves.json | 7 + .../hexcasting/blockstates/conjured.json | 7 + .../blockstates/conjured_block.json | 7 + .../blockstates/directrix_redstone.json | 76 + .../blockstates/edified_button.json | 118 ++ .../hexcasting/blockstates/edified_door.json | 124 ++ .../hexcasting/blockstates/edified_log.json | 16 + .../hexcasting/blockstates/edified_panel.json | 7 + .../blockstates/edified_planks.json | 17 + .../blockstates/edified_pressure_plate.json | 10 + .../hexcasting/blockstates/edified_slab.json | 13 + .../blockstates/edified_stairs.json | 209 +++ .../hexcasting/blockstates/edified_tile.json | 7 + .../blockstates/edified_trapdoor.json | 68 + .../hexcasting/blockstates/edified_wood.json | 16 + .../blockstates/empty_directrix.json | 22 + .../hexcasting/blockstates/empty_impetus.json | 40 + .../hexcasting/blockstates/impetus_look.json | 40 + .../blockstates/impetus_rightclick.json | 40 + .../blockstates/impetus_storedplayer.json | 76 + .../hexcasting/blockstates/scroll_paper.json | 7 + .../blockstates/scroll_paper_lantern.json | 7 + .../assets/hexcasting/blockstates/slate.json | 122 ++ .../hexcasting/blockstates/slate_block.json | 7 + .../blockstates/stripped_edified_log.json | 16 + .../blockstates/stripped_edified_wood.json | 16 + .../models/block/akashic_bookshelf.json | 68 + .../models/block/akashic_bookshelf_1.json | 6 + .../models/block/akashic_bookshelf_2.json | 6 + .../models/block/akashic_bookshelf_3.json | 6 + .../models/block/akashic_bookshelf_4.json | 6 + .../models/block/akashic_bookshelf_empty.json | 8 + .../models/block/akashic_ligature.json | 6 + .../models/block/akashic_record.json | 87 ++ .../models/block/amethyst_dust_block.json | 6 + .../models/block/amethyst_edified_leaves.json | 7 + .../models/block/amethyst_tiles.json | 6 + .../models/block/ancient_scroll_paper.json | 6 + .../block/ancient_scroll_paper_lantern.json | 8 + .../block/aventurine_edified_leaves.json | 7 + .../models/block/citrine_edified_leaves.json | 7 + .../hexcasting/models/block/conjured.json | 6 + .../models/block/edified_button.json | 6 + .../models/block/edified_button_pressed.json | 6 + .../block/edified_door_bottom_left.json | 8 + .../block/edified_door_bottom_left_open.json | 8 + .../block/edified_door_bottom_right.json | 8 + .../block/edified_door_bottom_right_open.json | 8 + .../models/block/edified_door_top_left.json | 8 + .../block/edified_door_top_left_open.json | 8 + .../models/block/edified_door_top_right.json | 8 + .../block/edified_door_top_right_open.json | 8 + .../hexcasting/models/block/edified_log.json | 7 + .../models/block/edified_log_horizontal.json | 7 + .../models/block/edified_panel.json | 6 + .../models/block/edified_planks.json | 6 + .../models/block/edified_planks_2.json | 6 + .../models/block/edified_planks_3.json | 6 + .../models/block/edified_pressure_plate.json | 6 + .../block/edified_pressure_plate_down.json | 6 + .../hexcasting/models/block/edified_slab.json | 8 + .../models/block/edified_slab_top.json | 8 + .../models/block/edified_stairs.json | 8 + .../models/block/edified_stairs_inner.json | 8 + .../models/block/edified_stairs_outer.json | 8 + .../hexcasting/models/block/edified_tile.json | 6 + .../models/block/edified_trapdoor_bottom.json | 7 + .../models/block/edified_trapdoor_open.json | 7 + .../models/block/edified_trapdoor_top.json | 7 + .../hexcasting/models/block/edified_wood.json | 7 + .../models/block/edified_wood_horizontal.json | 7 + .../models/block/empty_directrix_dim_x.json | 12 + .../models/block/empty_directrix_dim_y.json | 12 + .../models/block/empty_directrix_dim_z.json | 12 + .../models/block/empty_directrix_lit_x.json | 12 + .../models/block/empty_directrix_lit_y.json | 12 + .../models/block/empty_directrix_lit_z.json | 12 + .../models/block/empty_impetus_dim_down.json | 12 + .../models/block/empty_impetus_dim_east.json | 12 + .../models/block/empty_impetus_dim_north.json | 12 + .../models/block/empty_impetus_dim_south.json | 12 + .../models/block/empty_impetus_dim_up.json | 12 + .../models/block/empty_impetus_dim_west.json | 12 + .../models/block/empty_impetus_lit_down.json | 12 + .../models/block/empty_impetus_lit_east.json | 12 + .../models/block/empty_impetus_lit_north.json | 12 + .../models/block/empty_impetus_lit_south.json | 12 + .../models/block/empty_impetus_lit_up.json | 12 + .../models/block/empty_impetus_lit_west.json | 12 + .../models/block/impetus_look_dim_down.json | 12 + .../models/block/impetus_look_dim_east.json | 12 + .../models/block/impetus_look_dim_north.json | 12 + .../models/block/impetus_look_dim_south.json | 12 + .../models/block/impetus_look_dim_up.json | 12 + .../models/block/impetus_look_dim_west.json | 12 + .../models/block/impetus_look_lit_down.json | 12 + .../models/block/impetus_look_lit_east.json | 12 + .../models/block/impetus_look_lit_north.json | 12 + .../models/block/impetus_look_lit_south.json | 12 + .../models/block/impetus_look_lit_up.json | 12 + .../models/block/impetus_look_lit_west.json | 12 + .../block/impetus_rightclick_dim_down.json | 12 + .../block/impetus_rightclick_dim_east.json | 12 + .../block/impetus_rightclick_dim_north.json | 12 + .../block/impetus_rightclick_dim_south.json | 12 + .../block/impetus_rightclick_dim_up.json | 12 + .../block/impetus_rightclick_dim_west.json | 12 + .../block/impetus_rightclick_lit_down.json | 12 + .../block/impetus_rightclick_lit_east.json | 12 + .../block/impetus_rightclick_lit_north.json | 12 + .../block/impetus_rightclick_lit_south.json | 12 + .../block/impetus_rightclick_lit_up.json | 12 + .../block/impetus_rightclick_lit_west.json | 12 + .../block/impetus_storedplayer_dim_down.json | 12 + .../block/impetus_storedplayer_dim_east.json | 12 + .../block/impetus_storedplayer_dim_north.json | 12 + .../block/impetus_storedplayer_dim_south.json | 12 + .../block/impetus_storedplayer_dim_up.json | 12 + .../block/impetus_storedplayer_dim_west.json | 12 + .../block/impetus_storedplayer_lit_down.json | 12 + .../block/impetus_storedplayer_lit_east.json | 12 + .../block/impetus_storedplayer_lit_north.json | 12 + .../block/impetus_storedplayer_lit_south.json | 12 + .../block/impetus_storedplayer_lit_up.json | 12 + .../block/impetus_storedplayer_lit_west.json | 12 + .../redstone_directrix_powered_dim_down.json | 12 + .../redstone_directrix_powered_dim_east.json | 12 + .../redstone_directrix_powered_dim_north.json | 12 + .../redstone_directrix_powered_dim_south.json | 12 + .../redstone_directrix_powered_dim_up.json | 12 + .../redstone_directrix_powered_dim_west.json | 12 + .../redstone_directrix_powered_lit_down.json | 12 + .../redstone_directrix_powered_lit_east.json | 12 + .../redstone_directrix_powered_lit_north.json | 12 + .../redstone_directrix_powered_lit_south.json | 12 + .../redstone_directrix_powered_lit_up.json | 12 + .../redstone_directrix_powered_lit_west.json | 12 + ...redstone_directrix_unpowered_dim_down.json | 12 + ...redstone_directrix_unpowered_dim_east.json | 12 + ...edstone_directrix_unpowered_dim_north.json | 12 + ...edstone_directrix_unpowered_dim_south.json | 12 + .../redstone_directrix_unpowered_dim_up.json | 12 + ...redstone_directrix_unpowered_dim_west.json | 12 + ...redstone_directrix_unpowered_lit_down.json | 12 + ...redstone_directrix_unpowered_lit_east.json | 12 + ...edstone_directrix_unpowered_lit_north.json | 12 + ...edstone_directrix_unpowered_lit_south.json | 12 + .../redstone_directrix_unpowered_lit_up.json | 12 + ...redstone_directrix_unpowered_lit_west.json | 12 + .../hexcasting/models/block/scroll_paper.json | 6 + .../models/block/scroll_paper_lantern.json | 8 + .../hexcasting/models/block/slate_block.json | 6 + .../models/block/stripped_edified_log.json | 7 + .../stripped_edified_log_horizontal.json | 7 + .../models/block/stripped_edified_wood.json | 7 + .../stripped_edified_wood_horizontal.json | 7 + .../assets/hexcasting/models/item/abacus.json | 6 + .../hexcasting/models/item/acacia_staff.json | 26 + .../models/item/akashic_bookshelf.json | 3 + .../models/item/akashic_connector.json | 3 + .../models/item/akashic_record.json | 3 + .../hexcasting/models/item/amethyst_dust.json | 6 + .../models/item/amethyst_dust_block.json | 3 + .../models/item/amethyst_edified_leaves.json | 3 + .../models/item/amethyst_sconce.json | 3 + .../models/item/amethyst_tiles.json | 3 + .../models/item/ancient_scroll_paper.json | 3 + .../item/ancient_scroll_paper_lantern.json | 3 + .../hexcasting/models/item/artifact.json | 20 + .../models/item/artifact_filled.json | 6 + .../item/aventurine_edified_leaves.json | 3 + .../hexcasting/models/item/battery.json | 109 ++ .../hexcasting/models/item/birch_staff.json | 26 + .../hexcasting/models/item/bosnia_staff.json | 6 + .../models/item/charged_amethyst.json | 6 + .../models/item/citrine_edified_leaves.json | 3 + .../hexcasting/models/item/conjured.json | 6 + .../models/item/conjured_block.json | 6 + .../models/item/creative_unlocker.json | 6 + .../hexcasting/models/item/crimson_staff.json | 26 + .../assets/hexcasting/models/item/cypher.json | 20 + .../hexcasting/models/item/cypher_filled.json | 6 + .../models/item/dark_oak_staff.json | 26 + .../models/item/directrix_redstone.json | 3 + .../models/item/dye_colorizer_black.json | 6 + .../models/item/dye_colorizer_blue.json | 6 + .../models/item/dye_colorizer_brown.json | 6 + .../models/item/dye_colorizer_cyan.json | 6 + .../models/item/dye_colorizer_gray.json | 6 + .../models/item/dye_colorizer_green.json | 6 + .../models/item/dye_colorizer_light_blue.json | 6 + .../models/item/dye_colorizer_light_gray.json | 6 + .../models/item/dye_colorizer_lime.json | 6 + .../models/item/dye_colorizer_magenta.json | 6 + .../models/item/dye_colorizer_orange.json | 6 + .../models/item/dye_colorizer_pink.json | 6 + .../models/item/dye_colorizer_purple.json | 6 + .../models/item/dye_colorizer_red.json | 6 + .../models/item/dye_colorizer_white.json | 6 + .../models/item/dye_colorizer_yellow.json | 6 + .../models/item/edified_button.json | 6 + .../hexcasting/models/item/edified_door.json | 6 + .../hexcasting/models/item/edified_log.json | 3 + .../hexcasting/models/item/edified_panel.json | 3 + .../models/item/edified_planks.json | 3 + .../models/item/edified_pressure_plate.json | 3 + .../hexcasting/models/item/edified_slab.json | 3 + .../hexcasting/models/item/edified_staff.json | 26 + .../models/item/edified_stairs.json | 3 + .../hexcasting/models/item/edified_tile.json | 3 + .../models/item/edified_trapdoor.json | 3 + .../hexcasting/models/item/edified_wood.json | 3 + .../models/item/empty_directrix.json | 3 + .../hexcasting/models/item/empty_impetus.json | 3 + .../assets/hexcasting/models/item/focus.json | 26 + .../hexcasting/models/item/focus_filled.json | 7 + .../hexcasting/models/item/focus_sealed.json | 7 + .../hexcasting/models/item/impetus_look.json | 3 + .../models/item/impetus_rightclick.json | 3 + .../models/item/impetus_storedplayer.json | 3 + .../models/item/jeweler_hammer.json | 6 + .../hexcasting/models/item/jungle_staff.json | 26 + .../assets/hexcasting/models/item/lens.json | 20 + .../hexcasting/models/item/lore_fragment.json | 6 + .../hexcasting/models/item/oak_staff.json | 26 + .../hexcasting/models/item/old_staff.json | 6 + .../models/item/patchouli_book.json | 6 + .../hexcasting/models/item/phial_large_0.json | 6 + .../hexcasting/models/item/phial_large_1.json | 6 + .../hexcasting/models/item/phial_large_2.json | 6 + .../hexcasting/models/item/phial_large_3.json | 6 + .../hexcasting/models/item/phial_large_4.json | 6 + .../models/item/phial_medium_0.json | 6 + .../models/item/phial_medium_1.json | 6 + .../models/item/phial_medium_2.json | 6 + .../models/item/phial_medium_3.json | 6 + .../models/item/phial_medium_4.json | 6 + .../hexcasting/models/item/phial_small_0.json | 6 + .../hexcasting/models/item/phial_small_1.json | 6 + .../hexcasting/models/item/phial_small_2.json | 6 + .../hexcasting/models/item/phial_small_3.json | 6 + .../hexcasting/models/item/phial_small_4.json | 6 + .../models/item/pride_colorizer_agender.json | 6 + .../models/item/pride_colorizer_aroace.json | 6 + .../item/pride_colorizer_aromantic.json | 6 + .../models/item/pride_colorizer_asexual.json | 6 + .../models/item/pride_colorizer_bisexual.json | 6 + .../models/item/pride_colorizer_demiboy.json | 6 + .../models/item/pride_colorizer_demigirl.json | 6 + .../models/item/pride_colorizer_gay.json | 6 + .../item/pride_colorizer_genderfluid.json | 6 + .../item/pride_colorizer_genderqueer.json | 6 + .../models/item/pride_colorizer_intersex.json | 6 + .../models/item/pride_colorizer_lesbian.json | 6 + .../item/pride_colorizer_nonbinary.json | 6 + .../item/pride_colorizer_pansexual.json | 6 + .../models/item/pride_colorizer_plural.json | 6 + .../item/pride_colorizer_transgender.json | 6 + .../assets/hexcasting/models/item/scroll.json | 16 + .../models/item/scroll_ancient_large.json | 6 + .../models/item/scroll_ancient_medium.json | 6 + .../models/item/scroll_ancient_small.json | 6 + .../hexcasting/models/item/scroll_medium.json | 16 + .../hexcasting/models/item/scroll_paper.json | 3 + .../models/item/scroll_paper_lantern.json | 3 + .../models/item/scroll_pristine_large.json | 6 + .../models/item/scroll_pristine_medium.json | 6 + .../models/item/scroll_pristine_small.json | 6 + .../hexcasting/models/item/scroll_small.json | 16 + .../assets/hexcasting/models/item/slate.json | 16 + .../hexcasting/models/item/slate_blank.json | 6 + .../hexcasting/models/item/slate_block.json | 3 + .../hexcasting/models/item/slate_written.json | 6 + .../hexcasting/models/item/spellbook.json | 26 + .../models/item/spellbook_filled.json | 7 + .../models/item/spellbook_sealed.json | 7 + .../hexcasting/models/item/spruce_staff.json | 26 + .../models/item/stripped_edified_log.json | 3 + .../models/item/stripped_edified_wood.json | 3 + .../hexcasting/models/item/sub_sandwich.json | 6 + .../hexcasting/models/item/trinket.json | 20 + .../models/item/trinket_filled.json | 6 + .../models/item/uuid_colorizer.json | 6 + .../hexcasting/models/item/warped_staff.json | 26 + .../advancements/aaa_wasteful_cast.json | 33 + .../hexcasting/advancements/aab_big_cast.json | 33 + .../advancements/enlightenment.json | 37 + .../data/hexcasting/advancements/lore.json | 35 + .../advancements/lore/experiment1.json | 28 + .../advancements/lore/experiment2.json | 28 + .../advancements/lore/inventory.json | 28 + .../advancements/lore/terabithia1.json | 28 + .../advancements/lore/terabithia2.json | 28 + .../advancements/lore/terabithia3.json | 28 + .../advancements/lore/terabithia4.json | 28 + .../advancements/lore/terabithia5.json | 28 + .../hexcasting/advancements/opened_eyes.json | 33 + .../data/hexcasting/advancements/root.json | 35 + .../advancements/y_u_no_cast_angy.json | 28 + .../main/java/at/petrak/hexcasting/README.md | 9 + .../hexcasting/annotations/SoftImplement.java | 30 + .../java/at/petrak/hexcasting/api/HexAPI.java | 32 + .../hexcasting/api/PatternRegistry.java | 336 +++++ .../hexcasting/api/addldata/ADColorizer.java | 37 + .../hexcasting/api/addldata/ADHexHolder.java | 21 + .../hexcasting/api/addldata/ADIotaHolder.java | 32 + .../api/addldata/ADMediaHolder.java | 108 ++ .../ItemDelegatingEntityIotaHolder.java | 83 ++ .../hexcasting/api/addldata/package-info.java | 10 + .../FailToCastGreatSpellTrigger.java | 40 + .../advancements/HexAdvancementTriggers.java | 15 + .../api/advancements/OvercastTrigger.java | 86 ++ .../api/advancements/SpendMediaTrigger.java | 63 + .../hexcasting/api/block/HexBlockEntity.java | 49 + .../block/circle/BlockAbstractImpetus.java | 94 ++ .../block/circle/BlockCircleComponent.java | 77 + .../circle/BlockEntityAbstractImpetus.java | 578 ++++++++ .../client/ScryingLensOverlayRegistry.java | 191 +++ .../hexcasting/api/item/ColorizerItem.java | 18 + .../hexcasting/api/item/HexHolderItem.java | 30 + .../hexcasting/api/item/IotaHolderItem.java | 114 ++ .../hexcasting/api/item/MediaHolderItem.java | 62 + .../api/misc/DamageSourceOvercast.java | 12 + .../api/misc/DamageSourceShameOnYou.java | 12 + .../api/misc/DiscoveryHandlers.java | 103 ++ .../api/misc/EntityDamageSourceOvercast.java | 13 + .../hexcasting/api/misc/FrozenColorizer.java | 78 ++ .../hexcasting/api/misc/HexDamageSources.java | 13 + .../hexcasting/api/misc/MediaConstants.java | 7 + .../hexcasting/api/misc/ScrollQuantity.java | 24 + .../hexcasting/api/misc/TriPredicate.java | 9 + .../hexcasting/api/mod/HexApiMessages.java | 51 + .../petrak/hexcasting/api/mod/HexConfig.java | 139 ++ .../hexcasting/api/mod/HexStatistics.java | 29 + .../at/petrak/hexcasting/api/mod/HexTags.java | 46 + .../hexcasting/api/player/FlightAbility.java | 11 + .../hexcasting/api/player/Sentinel.java | 14 + .../at/petrak/hexcasting/api/spell/Action.kt | 93 ++ .../hexcasting/api/spell/ConstMediaAction.kt | 36 + .../hexcasting/api/spell/OperationResult.kt | 15 + .../hexcasting/api/spell/OperatorUtils.kt | 312 +++++ .../hexcasting/api/spell/ParticleSpray.kt | 25 + .../hexcasting/api/spell/RenderedSpell.kt | 7 + .../hexcasting/api/spell/SpellAction.kt | 55 + .../petrak/hexcasting/api/spell/SpellList.kt | 93 ++ .../api/spell/casting/CastingContext.kt | 253 ++++ .../api/spell/casting/CastingHarness.kt | 689 +++++++++ .../api/spell/casting/ControllerInfo.kt | 16 + .../api/spell/casting/ResolvedPattern.kt | 27 + .../api/spell/casting/ResolvedPatternType.kt | 18 + .../api/spell/casting/SpecialPatterns.java | 10 + .../api/spell/casting/SpellCircleContext.kt | 56 + .../spell/casting/eval/ContinuationFrame.kt | 78 ++ .../api/spell/casting/eval/FrameEvaluate.kt | 51 + .../api/spell/casting/eval/FrameFinishEval.kt | 36 + .../api/spell/casting/eval/FrameForEach.kt | 87 ++ .../api/spell/casting/eval/FunctionalData.kt | 15 + .../spell/casting/eval/SpellContinuation.kt | 12 + .../spell/casting/sideeffects/EvalSound.java | 18 + .../casting/sideeffects/OperatorSideEffect.kt | 100 ++ .../api/spell/iota/BooleanIota.java | 68 + .../hexcasting/api/spell/iota/DoubleIota.java | 71 + .../hexcasting/api/spell/iota/EntityIota.java | 84 ++ .../api/spell/iota/GarbageIota.java | 63 + .../hexcasting/api/spell/iota/Iota.java | 56 + .../hexcasting/api/spell/iota/IotaType.java | 44 + .../hexcasting/api/spell/iota/ListIota.java | 117 ++ .../hexcasting/api/spell/iota/NullIota.java | 59 + .../api/spell/iota/PatternIota.java | 82 ++ .../hexcasting/api/spell/iota/Vec3Iota.java | 78 ++ .../api/spell/math/EulerPathFinder.kt | 88 ++ .../hexcasting/api/spell/math/HexAngle.kt | 8 + .../hexcasting/api/spell/math/HexCoord.kt | 62 + .../hexcasting/api/spell/math/HexDir.kt | 34 + .../hexcasting/api/spell/math/HexPattern.kt | 171 +++ .../hexcasting/api/spell/mishaps/Mishap.kt | 142 ++ .../spell/mishaps/MishapAlreadyBrainswept.kt | 25 + .../api/spell/mishaps/MishapBadBlock.kt | 34 + .../api/spell/mishaps/MishapBadBrainsweep.kt | 27 + .../api/spell/mishaps/MishapBadEntity.kt | 33 + .../api/spell/mishaps/MishapBadItem.kt | 30 + .../api/spell/mishaps/MishapBadOffhandItem.kt | 31 + .../spell/mishaps/MishapDisallowedSpell.kt | 21 + .../api/spell/mishaps/MishapDivideByZero.kt | 75 + .../spell/mishaps/MishapEntityTooFarAway.kt | 21 + .../api/spell/mishaps/MishapError.kt | 18 + .../api/spell/mishaps/MishapEvalTooDeep.kt | 18 + .../api/spell/mishaps/MishapImmuneEntity.kt | 20 + .../api/spell/mishaps/MishapInvalidIota.kt | 46 + .../api/spell/mishaps/MishapInvalidPattern.kt | 22 + .../mishaps/MishapInvalidSpellDatumType.kt | 21 + .../mishaps/MishapLocationInWrongDimension.kt | 24 + .../spell/mishaps/MishapLocationTooFarAway.kt | 21 + .../spell/mishaps/MishapNoAkashicRecord.kt | 19 + .../api/spell/mishaps/MishapNoSpellCircle.kt | 35 + .../api/spell/mishaps/MishapNotEnoughArgs.kt | 22 + .../api/spell/mishaps/MishapOthersName.kt | 58 + .../api/spell/mishaps/MishapShameOnYou.kt | 18 + .../spell/mishaps/MishapTooManyCloseParens.kt | 20 + .../api/spell/mishaps/MishapUnescapedValue.kt | 35 + .../petrak/hexcasting/api/utils/HexUtils.kt | 274 ++++ .../hexcasting/api/utils/MediaHelper.kt | 89 ++ .../at/petrak/hexcasting/api/utils/NBTDsl.kt | 210 +++ .../petrak/hexcasting/api/utils/NBTHelper.kt | 273 ++++ .../api/utils/PatternNameHelper.java | 28 + .../hexcasting/client/ClientTickCounter.java | 23 + .../client/HexAdditionalRenderers.java | 219 +++ .../client/RegisterClientStuff.java | 469 +++++++ .../at/petrak/hexcasting/client/RenderLib.kt | 495 +++++++ .../client/ShiftScrollListener.java | 60 + .../BlockEntityAkashicBookshelfRenderer.java | 88 ++ .../client/be/BlockEntitySlateRenderer.java | 101 ++ .../client/entity/WallScrollRenderer.java | 303 ++++ .../hexcasting/client/gui/GuiSpellcasting.kt | 488 +++++++ .../client/gui/PatternTooltipComponent.java | 122 ++ .../client/ktxt/ClientAccessorWrappers.kt | 9 + .../client/particles/ConjureParticle.java | 130 ++ .../client/shader/FakeBufferSource.java | 32 + .../client/shader/HexRenderTypes.java | 43 + .../hexcasting/client/shader/HexShaders.java | 25 + .../client/sound/GridSoundInstance.kt | 66 + .../common/blocks/BlockConjured.java | 131 ++ .../common/blocks/BlockConjuredLight.java | 95 ++ .../common/blocks/BlockFlammable.java | 36 + .../blocks/akashic/AkashicFloodfiller.java | 71 + .../blocks/akashic/BlockAkashicBookshelf.java | 109 ++ .../blocks/akashic/BlockAkashicLigature.java | 9 + .../blocks/akashic/BlockAkashicRecord.java | 64 + .../akashic/BlockEntityAkashicBookshelf.java | 85 ++ .../common/blocks/behavior/HexComposting.java | 24 + .../blocks/behavior/HexStrippables.java | 16 + .../blocks/circles/BlockEmptyImpetus.java | 82 ++ .../blocks/circles/BlockEntitySlate.java | 45 + .../common/blocks/circles/BlockSlate.java | 217 +++ .../directrix/BlockEmptyDirectrix.java | 79 ++ .../directrix/BlockRedstoneDirectrix.java | 127 ++ .../impetuses/BlockLookingImpetus.java | 45 + .../impetuses/BlockRightClickImpetus.java | 41 + .../impetuses/BlockStoredPlayerImpetus.java | 103 ++ .../blocks/decoration/BlockAkashicLeaves.java | 29 + .../blocks/decoration/BlockAkashicLog.java | 29 + .../common/blocks/decoration/BlockAxis.java | 9 + .../blocks/decoration/BlockHexDoor.java | 31 + .../decoration/BlockHexPressurePlate.java | 30 + .../blocks/decoration/BlockHexSlab.java | 30 + .../blocks/decoration/BlockHexStairs.java | 29 + .../blocks/decoration/BlockHexTrapdoor.java | 29 + .../blocks/decoration/BlockHexWoodButton.java | 30 + .../common/blocks/decoration/BlockSconce.java | 44 + .../blocks/entity/BlockEntityConjured.java | 107 ++ .../entity/BlockEntityLookingImpetus.java | 102 ++ .../entity/BlockEntityRightClickImpetus.java | 17 + .../BlockEntityStoredPlayerImpetus.java | 130 ++ .../common/casting/RegisterPatterns.java | 574 ++++++++ .../casting/operators/OpBlockAxisRaycast.kt | 40 + .../casting/operators/OpBlockRaycast.kt | 44 + .../casting/operators/OpEntityHeight.kt | 17 + .../common/casting/operators/OpEntityLook.kt | 17 + .../common/casting/operators/OpEntityPos.kt | 17 + .../casting/operators/OpEntityRaycast.kt | 39 + .../casting/operators/OpEntityVelocity.kt | 25 + .../operators/akashic/OpAkashicRead.kt | 29 + .../operators/akashic/OpAkashicWrite.kt | 71 + .../operators/circles/OpCircleBounds.kt | 24 + .../casting/operators/circles/OpImpetusDir.kt | 22 + .../casting/operators/circles/OpImpetusPos.kt | 18 + .../common/casting/operators/eval/OpEval.kt | 42 + .../casting/operators/eval/OpEvalDelay.kt | 18 + .../casting/operators/eval/OpForEach.kt | 36 + .../common/casting/operators/eval/OpHalt.kt | 34 + .../casting/operators/lists/OpAppend.kt | 17 + .../casting/operators/lists/OpConcat.kt | 17 + .../common/casting/operators/lists/OpCons.kt | 17 + .../casting/operators/lists/OpEmptyList.kt | 13 + .../common/casting/operators/lists/OpIndex.kt | 19 + .../casting/operators/lists/OpIndexOf.kt | 18 + .../casting/operators/lists/OpLastNToList.kt | 32 + .../casting/operators/lists/OpListSize.kt | 15 + .../operators/lists/OpModifyInPlace.kt | 15 + .../casting/operators/lists/OpRemove.kt | 22 + .../casting/operators/lists/OpReverski.kt | 14 + .../casting/operators/lists/OpSingleton.kt | 13 + .../common/casting/operators/lists/OpSlice.kt | 24 + .../common/casting/operators/lists/OpSplat.kt | 14 + .../casting/operators/lists/OpUnCons.kt | 19 + .../casting/operators/local/OpPeekLocal.kt | 20 + .../casting/operators/local/OpPushLocal.kt | 22 + .../common/casting/operators/math/OpAbsLen.kt | 19 + .../common/casting/operators/math/OpAdd.kt | 30 + .../common/casting/operators/math/OpCeil.kt | 19 + .../casting/operators/math/OpCoerceToAxial.kt | 21 + .../casting/operators/math/OpConstructVec.kt | 18 + .../operators/math/OpDeconstructVec.kt | 15 + .../casting/operators/math/OpDivCross.kt | 42 + .../common/casting/operators/math/OpFloor.kt | 18 + .../common/casting/operators/math/OpLog.kt | 22 + .../common/casting/operators/math/OpModulo.kt | 22 + .../common/casting/operators/math/OpMulDot.kt | 29 + .../casting/operators/math/OpPowProj.kt | 49 + .../common/casting/operators/math/OpRandom.kt | 15 + .../common/casting/operators/math/OpSub.kt | 30 + .../casting/operators/math/bit/OpAnd.kt | 24 + .../casting/operators/math/bit/OpNot.kt | 16 + .../common/casting/operators/math/bit/OpOr.kt | 24 + .../casting/operators/math/bit/OpToSet.kt | 24 + .../casting/operators/math/bit/OpXor.kt | 33 + .../casting/operators/math/logic/OpBoolAnd.kt | 17 + .../casting/operators/math/logic/OpBoolIf.kt | 17 + .../casting/operators/math/logic/OpBoolNot.kt | 16 + .../casting/operators/math/logic/OpBoolOr.kt | 17 + .../casting/operators/math/logic/OpBoolXor.kt | 17 + .../operators/math/logic/OpCoerceToBool.kt | 14 + .../casting/operators/math/logic/OpCompare.kt | 22 + .../operators/math/logic/OpEquality.kt | 17 + .../casting/operators/math/trig/OpArcCos.kt | 18 + .../casting/operators/math/trig/OpArcSin.kt | 18 + .../casting/operators/math/trig/OpArcTan.kt | 18 + .../casting/operators/math/trig/OpArcTan2.kt | 19 + .../casting/operators/math/trig/OpCos.kt | 18 + .../casting/operators/math/trig/OpSin.kt | 18 + .../casting/operators/math/trig/OpTan.kt | 23 + .../common/casting/operators/rw/OpRead.kt | 27 + .../common/casting/operators/rw/OpReadable.kt | 26 + .../casting/operators/rw/OpTheCoolerRead.kt | 29 + .../operators/rw/OpTheCoolerReadable.kt | 29 + .../operators/rw/OpTheCoolerWritable.kt | 28 + .../casting/operators/rw/OpTheCoolerWrite.kt | 57 + .../common/casting/operators/rw/OpWritable.kt | 33 + .../common/casting/operators/rw/OpWrite.kt | 50 + .../operators/selectors/OpGetCaster.kt | 15 + .../operators/selectors/OpGetEntitiesBy.kt | 56 + .../operators/selectors/OpGetEntityAt.kt | 26 + .../casting/operators/spells/OpAddMotion.kt | 45 + .../common/casting/operators/spells/OpBeep.kt | 40 + .../casting/operators/spells/OpBlink.kt | 61 + .../casting/operators/spells/OpBreakBlock.kt | 54 + .../casting/operators/spells/OpColorize.kt | 47 + .../operators/spells/OpConjureBlock.kt | 72 + .../casting/operators/spells/OpCreateFluid.kt | 61 + .../operators/spells/OpDestroyFluid.kt | 139 ++ .../operators/spells/OpEdifySapling.kt | 57 + .../casting/operators/spells/OpErase.kt | 54 + .../casting/operators/spells/OpExplode.kt | 49 + .../casting/operators/spells/OpExtinguish.kt | 125 ++ .../casting/operators/spells/OpIgnite.kt | 61 + .../casting/operators/spells/OpMakeBattery.kt | 85 ++ .../operators/spells/OpMakePackagedSpell.kt | 75 + .../casting/operators/spells/OpPlaceBlock.kt | 107 ++ .../operators/spells/OpPotionEffect.kt | 53 + .../casting/operators/spells/OpPrint.kt | 36 + .../casting/operators/spells/OpRecharge.kt | 78 ++ .../OpTheOnlyReasonAnyoneDownloadedPsi.kt | 49 + .../operators/spells/great/OpBrainsweep.kt | 76 + .../operators/spells/great/OpFlight.kt | 107 ++ .../operators/spells/great/OpLightning.kt | 42 + .../operators/spells/great/OpTeleport.kt | 144 ++ .../operators/spells/great/OpWeather.kt | 42 + .../spells/sentinel/OpCreateSentinel.kt | 45 + .../spells/sentinel/OpDestroySentinel.kt | 39 + .../spells/sentinel/OpGetSentinelPos.kt | 24 + .../spells/sentinel/OpGetSentinelWayfind.kt | 31 + .../OpAlwinfyHasAscendedToABeingOfPureMath.kt | 67 + .../casting/operators/stack/OpBitMask.kt | 43 + .../casting/operators/stack/OpDuplicateN.kt | 22 + .../casting/operators/stack/OpFisherman.kt | 43 + .../operators/stack/OpFishermanButItCopies.kt | 28 + .../common/casting/operators/stack/OpMask.kt | 27 + .../casting/operators/stack/OpStackSize.kt | 20 + .../casting/operators/stack/OpTwiddling.kt | 13 + .../common/command/BrainsweepCommand.java | 36 + .../common/command/ListPatternsCommand.java | 153 ++ .../common/command/PatternResLocArgument.java | 53 + .../common/command/RecalcPatternsCommand.java | 23 + .../common/entities/EntityWallScroll.java | 216 +++ .../common/entities/HexEntities.java | 36 + .../hexcasting/common/items/ItemAbacus.java | 72 + .../hexcasting/common/items/ItemFocus.java | 73 + .../common/items/ItemJewelerHammer.java | 21 + .../hexcasting/common/items/ItemLens.java | 129 ++ .../common/items/ItemLoreFragment.java | 83 ++ .../hexcasting/common/items/ItemScroll.java | 148 ++ .../hexcasting/common/items/ItemSlate.java | 124 ++ .../common/items/ItemSpellbook.java | 241 ++++ .../hexcasting/common/items/ItemStaff.java | 51 + .../items/colorizer/ItemDyeColorizer.java | 27 + .../items/colorizer/ItemPrideColorizer.java | 82 ++ .../items/colorizer/ItemUUIDColorizer.java | 51 + .../items/magic/DebugUnlockerHolder.java | 55 + .../common/items/magic/ItemArtifact.java | 19 + .../items/magic/ItemCreativeUnlocker.java | 274 ++++ .../common/items/magic/ItemCypher.java | 19 + .../common/items/magic/ItemMediaBattery.java | 47 + .../common/items/magic/ItemMediaHolder.java | 112 ++ .../common/items/magic/ItemPackagedHex.java | 143 ++ .../common/items/magic/ItemTrinket.java | 19 + .../common/loot/AmethystReducerFunc.java | 50 + .../common/loot/HexLootHandler.java | 44 + .../common/loot/PatternScrollFunc.java | 59 + .../common/misc/AkashicTreeGrower.java | 55 + .../hexcasting/common/misc/Brainsweeping.java | 50 + .../common/misc/PatternTooltip.java | 13 + .../common/misc/PlayerPositionRecorder.java | 36 + .../hexcasting/common/network/IMessage.java | 24 + .../hexcasting/common/network/MsgBeepAck.java | 57 + .../common/network/MsgBlinkAck.java | 46 + .../common/network/MsgCastParticleAck.java | 107 ++ .../common/network/MsgNewSpellPatternAck.java | 78 ++ .../common/network/MsgNewSpellPatternSyn.java | 112 ++ .../common/network/MsgNewWallScrollAck.java | 61 + .../common/network/MsgOpenSpellGuiAck.java | 72 + .../MsgRecalcWallScrollDisplayAck.java | 48 + .../common/network/MsgShiftScrollSyn.java | 152 ++ .../MsgUpdateComparatorVisualsAck.java | 50 + .../particles/ConjureParticleOptions.java | 72 + .../common/recipe/BrainsweepRecipe.java | 107 ++ .../common/recipe/HexRecipeStuffRegistry.java | 61 + .../common/recipe/RecipeSerializerBase.java | 35 + .../common/recipe/SealFocusRecipe.java | 66 + .../common/recipe/SealSpellbookRecipe.java | 66 + .../recipe/ingredient/StateIngredient.java | 37 + .../ingredient/StateIngredientBlock.java | 83 ++ .../ingredient/StateIngredientBlockState.java | 103 ++ .../ingredient/StateIngredientBlocks.java | 97 ++ .../ingredient/StateIngredientHelper.java | 166 +++ .../recipe/ingredient/StateIngredientTag.java | 99 ++ .../StateIngredientTagExcluding.java | 95 ++ .../recipe/ingredient/VillagerIngredient.java | 175 +++ .../hexcasting/datagen/HexAdvancements.java | 116 ++ .../datagen/HexBlockTagProvider.java | 84 ++ .../datagen/HexItemTagProvider.java | 53 + .../hexcasting/datagen/HexLootTables.java | 157 +++ .../datagen/IXplatConditionsBuilder.java | 9 + .../hexcasting/datagen/IXplatIngredients.java | 33 + .../datagen/recipe/HexplatRecipes.kt | 486 +++++++ .../builders/BrainsweepRecipeBuilder.java | 102 ++ .../builders/CompatIngredientValue.java | 33 + .../builders/CompatProcessingOutput.java | 18 + .../builders/CreateCrushingRecipeBuilder.java | 163 +++ .../FarmersDelightCuttingRecipeBuilder.java | 165 +++ .../FarmersDelightToolIngredient.java | 7 + .../recipe/builders/ItemProcessingOutput.java | 27 + .../recipe/builders/ProcessingOutput.java | 7 + .../petrak/hexcasting/interop/HexInterop.java | 75 + .../patchouli/AbstractPatternComponent.java | 65 + .../patchouli/BrainsweepProcessor.java | 73 + .../patchouli/CustomComponentTooltip.java | 46 + .../patchouli/LookupPatternComponent.java | 43 + .../patchouli/ManualPatternComponent.java | 57 + .../patchouli/MultiCraftingProcessor.java | 98 ++ .../interop/patchouli/PatchouliUtils.java | 76 + .../interop/patchouli/PatternProcessor.java | 33 + .../hexcasting/interop/pehkui/OpGetScale.kt | 17 + .../hexcasting/interop/pehkui/OpSetScale.kt | 31 + .../interop/pehkui/PehkuiInterop.java | 30 + .../interop/utils/PatternDrawingUtil.java | 126 ++ .../interop/utils/PatternEntry.java | 11 + .../utils/PhialRecipeStackBuilder.java | 55 + .../hexcasting/ktxt/AccessorWrappers.kt | 40 + .../mixin/MixinAbstractVillager.java | 21 + .../at/petrak/hexcasting/mixin/MixinMob.java | 28 + .../petrak/hexcasting/mixin/MixinRaider.java | 17 + .../mixin/MixinReloadableServerResources.java | 37 + .../hexcasting/mixin/MixinVillager.java | 37 + .../petrak/hexcasting/mixin/MixinWitch.java | 17 + .../mixin/accessor/AccessorEntity.java | 11 + .../mixin/accessor/AccessorLivingEntity.java | 35 + .../mixin/accessor/AccessorLootTable.java | 25 + .../mixin/accessor/AccessorUseOnContext.java | 21 + .../mixin/accessor/AccessorVillager.java | 15 + .../accessor/CriteriaTriggersAccessor.java | 14 + .../client/AccessorCompositeRenderType.java | 11 + .../AccessorEmptyTextureStateShard.java | 14 + .../accessor/client/AccessorMouseHandler.java | 14 + .../client/AccessorRenderStateShard.java | 11 + .../accessor/client/AccessorRenderType.java | 17 + .../mixin/client/MixinClientLevel.java | 49 + .../xplat/IClientXplatAbstractions.java | 48 + .../hexcasting/xplat/IForgeLikeBlock.java | 21 + .../hexcasting/xplat/IXplatAbstractions.java | 190 +++ .../petrak/hexcasting/xplat/IXplatTags.java | 11 + .../at/petrak/hexcasting/xplat/Platform.java | 5 + .../assets/hexcasting/lang/en_us.json | 1242 ++++++++++++++++ .../assets/hexcasting/lang/ru_ru.json | 888 ++++++++++++ .../assets/hexcasting/lang/zh_cn.json | 1246 +++++++++++++++++ .../models/block/amethyst_sconce.json | 109 ++ .../models/block/cube_half_mirrored.json | 19 + .../assets/hexcasting/models/block/slate.json | 56 + .../particles/conjure_block_particle.json | 12 + .../particles/conjure_light_particle.json | 5 + .../resources/assets/hexcasting/sounds.json | 133 ++ .../assets/hexcasting/sounds/abacus1.ogg | Bin 0 -> 16200 bytes .../assets/hexcasting/sounds/abacus2.ogg | Bin 0 -> 9769 bytes .../assets/hexcasting/sounds/abacus3.ogg | Bin 0 -> 7391 bytes .../assets/hexcasting/sounds/abacus_shake.ogg | Bin 0 -> 11518 bytes .../assets/hexcasting/sounds/add_line.ogg | Bin 0 -> 12256 bytes .../assets/hexcasting/sounds/add_pattern.ogg | Bin 0 -> 19087 bytes .../assets/hexcasting/sounds/cast_hex.ogg | Bin 0 -> 19484 bytes .../hexcasting/sounds/casting_ambiance.ogg | Bin 0 -> 515838 bytes .../assets/hexcasting/sounds/fail_pattern.ogg | Bin 0 -> 19471 bytes .../assets/hexcasting/sounds/hermes.ogg | Bin 0 -> 104657 bytes .../assets/hexcasting/sounds/thoth.ogg | Bin 0 -> 104657 bytes .../textures/block/akashic_bookshelf.png | Bin 0 -> 269 bytes .../block/akashic_bookshelf_horiz.png | Bin 0 -> 278 bytes .../block/akashic_bookshelf_overlay_1.png | Bin 0 -> 266 bytes .../block/akashic_bookshelf_overlay_2.png | Bin 0 -> 279 bytes .../block/akashic_bookshelf_overlay_3.png | Bin 0 -> 312 bytes .../block/akashic_bookshelf_overlay_4.png | Bin 0 -> 272 bytes .../textures/block/akashic_bookshelf_vert.png | Bin 0 -> 268 bytes .../textures/block/akashic_ligature.png | Bin 0 -> 446 bytes .../textures/block/akashic_record.png | Bin 0 -> 455 bytes .../textures/block/akashic_record_inner.png | Bin 0 -> 296 bytes .../textures/block/amethyst_bricks.png | Bin 0 -> 387 bytes .../textures/block/amethyst_bricks_small.png | Bin 0 -> 272 bytes .../textures/block/amethyst_chiseled.png | Bin 0 -> 494 bytes .../textures/block/amethyst_dust_block.png | Bin 0 -> 337 bytes .../block/amethyst_edified_leaves.png | Bin 0 -> 469 bytes .../textures/block/amethyst_polished.png | Bin 0 -> 492 bytes .../textures/block/amethyst_tiles.png | Bin 0 -> 371 bytes .../textures/block/ancient_scroll_paper.png | Bin 0 -> 298 bytes .../block/ancient_scroll_paper_lantern.png | Bin 0 -> 331 bytes .../ancient_scroll_paper_lantern_bottom.png | Bin 0 -> 511 bytes .../ancient_scroll_paper_lantern_side.png | Bin 0 -> 253 bytes .../ancient_scroll_paper_lantern_top.png | Bin 0 -> 505 bytes .../block/aventurine_edified_leaves.png | Bin 0 -> 463 bytes .../textures/block/citrine_edified_leaves.png | Bin 0 -> 458 bytes .../textures/block/directrix/arrows.ase | Bin 0 -> 2358 bytes .../block/directrix/empty/end_dim.png | Bin 0 -> 421 bytes .../block/directrix/empty/end_lit.png | Bin 0 -> 500 bytes .../block/directrix/empty/horiz_dim.png | Bin 0 -> 486 bytes .../block/directrix/empty/horiz_lit.png | Bin 0 -> 585 bytes .../block/directrix/empty/vert_dim.png | Bin 0 -> 474 bytes .../block/directrix/empty/vert_lit.png | Bin 0 -> 572 bytes .../block/directrix/redstone/back_powered.png | Bin 0 -> 458 bytes .../directrix/redstone/back_unpowered.png | Bin 0 -> 459 bytes .../directrix/redstone/down_powered_dim.png | Bin 0 -> 616 bytes .../directrix/redstone/down_powered_lit.png | Bin 0 -> 606 bytes .../directrix/redstone/down_unpowered_dim.png | Bin 0 -> 609 bytes .../directrix/redstone/down_unpowered_lit.png | Bin 0 -> 607 bytes .../block/directrix/redstone/front_dim.png | Bin 0 -> 491 bytes .../block/directrix/redstone/front_lit.png | Bin 0 -> 497 bytes .../directrix/redstone/left_powered_dim.png | Bin 0 -> 624 bytes .../directrix/redstone/left_powered_lit.png | Bin 0 -> 616 bytes .../directrix/redstone/left_unpowered_dim.png | Bin 0 -> 619 bytes .../directrix/redstone/left_unpowered_lit.png | Bin 0 -> 615 bytes .../directrix/redstone/right_powered_dim.png | Bin 0 -> 626 bytes .../directrix/redstone/right_powered_lit.png | Bin 0 -> 628 bytes .../redstone/right_unpowered_dim.png | Bin 0 -> 628 bytes .../redstone/right_unpowered_lit.png | Bin 0 -> 629 bytes .../directrix/redstone/up_powered_dim.png | Bin 0 -> 644 bytes .../directrix/redstone/up_powered_lit.png | Bin 0 -> 613 bytes .../directrix/redstone/up_unpowered_dim.png | Bin 0 -> 639 bytes .../directrix/redstone/up_unpowered_lit.png | Bin 0 -> 613 bytes .../textures/block/edified_door_lower.png | Bin 0 -> 244 bytes .../textures/block/edified_door_upper.png | Bin 0 -> 308 bytes .../hexcasting/textures/block/edified_log.png | Bin 0 -> 354 bytes .../textures/block/edified_log_top.png | Bin 0 -> 430 bytes .../textures/block/edified_panel.png | Bin 0 -> 330 bytes .../textures/block/edified_planks.png | Bin 0 -> 371 bytes .../textures/block/edified_planks_2.png | Bin 0 -> 419 bytes .../textures/block/edified_planks_3.png | Bin 0 -> 374 bytes .../textures/block/edified_tile.png | Bin 0 -> 342 bytes .../textures/block/edified_trapdoor.png | Bin 0 -> 388 bytes .../textures/block/impetus/atlas.png | Bin 0 -> 4878 bytes .../textures/block/impetus/back_dim.png | Bin 0 -> 506 bytes .../textures/block/impetus/back_empty_dim.png | Bin 0 -> 450 bytes .../textures/block/impetus/back_empty_lit.png | Bin 0 -> 497 bytes .../textures/block/impetus/back_lit.png | Bin 0 -> 502 bytes .../textures/block/impetus/down_dim.png | Bin 0 -> 599 bytes .../textures/block/impetus/down_empty_dim.png | Bin 0 -> 447 bytes .../textures/block/impetus/down_empty_lit.png | Bin 0 -> 575 bytes .../textures/block/impetus/down_lit.png | Bin 0 -> 580 bytes .../block/impetus/front_empty_dim.png | Bin 0 -> 401 bytes .../block/impetus/front_empty_lit.png | Bin 0 -> 521 bytes .../textures/block/impetus/left_dim.png | Bin 0 -> 584 bytes .../textures/block/impetus/left_empty_dim.png | Bin 0 -> 514 bytes .../textures/block/impetus/left_empty_lit.png | Bin 0 -> 591 bytes .../textures/block/impetus/left_lit.png | Bin 0 -> 584 bytes .../textures/block/impetus/look_dim.png | Bin 0 -> 514 bytes .../textures/block/impetus/look_lit.png | Bin 0 -> 518 bytes .../textures/block/impetus/right_dim.png | Bin 0 -> 581 bytes .../block/impetus/right_empty_dim.png | Bin 0 -> 461 bytes .../block/impetus/right_empty_lit.png | Bin 0 -> 580 bytes .../textures/block/impetus/right_lit.png | Bin 0 -> 598 bytes .../textures/block/impetus/rightclick_dim.png | Bin 0 -> 569 bytes .../textures/block/impetus/rightclick_lit.png | Bin 0 -> 601 bytes .../textures/block/impetus/something.ase | Bin 0 -> 771 bytes .../textures/block/impetus/something.png | Bin 0 -> 521 bytes .../block/impetus/storedplayer_dim.png | Bin 0 -> 534 bytes .../block/impetus/storedplayer_lit.png | Bin 0 -> 565 bytes .../textures/block/impetus/up_dim.png | Bin 0 -> 568 bytes .../textures/block/impetus/up_empty_dim.png | Bin 0 -> 473 bytes .../textures/block/impetus/up_empty_lit.png | Bin 0 -> 557 bytes .../textures/block/impetus/up_lit.png | Bin 0 -> 561 bytes .../textures/block/scroll_paper.png | Bin 0 -> 239 bytes .../textures/block/scroll_paper_lantern.png | Bin 0 -> 283 bytes .../block/scroll_paper_lantern_bottom.png | Bin 0 -> 505 bytes .../block/scroll_paper_lantern_side.png | Bin 0 -> 241 bytes .../block/scroll_paper_lantern_top.png | Bin 0 -> 501 bytes .../hexcasting/textures/block/slate.png | Bin 0 -> 330 bytes .../textures/block/slate_directional.png | Bin 0 -> 330 bytes .../textures/block/smooth_amethyst.png | Bin 0 -> 411 bytes .../textures/block/stripped_edified_log.png | Bin 0 -> 372 bytes .../block/stripped_edified_log_top.png | Bin 0 -> 387 bytes .../textures/entity/scroll_ancient_large.png | Bin 0 -> 831 bytes .../textures/entity/scroll_ancient_medium.png | Bin 0 -> 707 bytes .../textures/entity/scroll_large.png | Bin 0 -> 542 bytes .../textures/entity/scroll_medium.png | Bin 0 -> 409 bytes .../hexcasting/textures/entity/sentinel.png | Bin 0 -> 254 bytes .../hexcasting/textures/entity/white.png | Bin 0 -> 81 bytes .../hexcasting/textures/gui/brainsweep.png | Bin 0 -> 1269 bytes .../textures/gui/brainsweep_emi.png | Bin 0 -> 179 bytes .../textures/gui/brainsweep_jei.png | Bin 0 -> 2643 bytes .../assets/hexcasting/textures/gui/edify.png | Bin 0 -> 2889 bytes .../hexcasting/textures/gui/edify_emi.png | Bin 0 -> 203 bytes .../hexcasting/textures/gui/edify_jei.png | Bin 0 -> 2702 bytes .../textures/gui/entries/spell_circle.png | Bin 0 -> 35018 bytes .../hexcasting/textures/gui/patchi_book.png | Bin 0 -> 10172 bytes .../hexcasting/textures/gui/patchi_filler.png | Bin 0 -> 5266 bytes .../assets/hexcasting/textures/gui/phial.png | Bin 0 -> 2473 bytes .../hexcasting/textures/gui/phial_emi.png | Bin 0 -> 147 bytes .../hexcasting/textures/gui/phial_jei.png | Bin 0 -> 2365 bytes .../assets/hexcasting/textures/gui/scroll.png | Bin 0 -> 620 bytes .../textures/gui/scroll_ancient.png | Bin 0 -> 862 bytes .../assets/hexcasting/textures/gui/slate.png | Bin 0 -> 722 bytes .../textures/gui/villager_leveling.png | Bin 0 -> 151 bytes .../textures/gui/villager_profession.png | Bin 0 -> 162 bytes .../hexcasting/textures/item/abacus.png | Bin 0 -> 470 bytes .../textures/item/amethyst_dust.png | Bin 0 -> 361 bytes .../hexcasting/textures/item/artifact.png | Bin 0 -> 520 bytes .../textures/item/artifact_filled.png | Bin 0 -> 537 bytes .../textures/item/charged_amethyst.png | Bin 0 -> 493 bytes .../textures/item/colorizer/dye_black.png | Bin 0 -> 2709 bytes .../item/colorizer/dye_black.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_blue.png | Bin 0 -> 2797 bytes .../item/colorizer/dye_blue.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_brown.png | Bin 0 -> 1941 bytes .../item/colorizer/dye_brown.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_cyan.png | Bin 0 -> 1995 bytes .../item/colorizer/dye_cyan.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_gray.png | Bin 0 -> 1938 bytes .../item/colorizer/dye_gray.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_green.png | Bin 0 -> 2709 bytes .../item/colorizer/dye_green.png.mcmeta | 127 ++ .../item/colorizer/dye_light_blue.png | Bin 0 -> 2740 bytes .../item/colorizer/dye_light_blue.png.mcmeta | 127 ++ .../item/colorizer/dye_light_gray.png | Bin 0 -> 2659 bytes .../item/colorizer/dye_light_gray.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_lime.png | Bin 0 -> 2794 bytes .../item/colorizer/dye_lime.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_magenta.png | Bin 0 -> 2008 bytes .../item/colorizer/dye_magenta.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_orange.png | Bin 0 -> 2720 bytes .../item/colorizer/dye_orange.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_pink.png | Bin 0 -> 1954 bytes .../item/colorizer/dye_pink.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_purple.png | Bin 0 -> 2792 bytes .../item/colorizer/dye_purple.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_red.png | Bin 0 -> 1931 bytes .../item/colorizer/dye_red.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_white.png | Bin 0 -> 2645 bytes .../item/colorizer/dye_white.png.mcmeta | 127 ++ .../textures/item/colorizer/dye_yellow.png | Bin 0 -> 2726 bytes .../item/colorizer/dye_yellow.png.mcmeta | 127 ++ .../textures/item/colorizer/pride_agender.png | Bin 0 -> 4611 bytes .../item/colorizer/pride_agender.png.mcmeta | 135 ++ .../textures/item/colorizer/pride_aroace.png | Bin 0 -> 4711 bytes .../item/colorizer/pride_aroace.png.mcmeta | 131 ++ .../item/colorizer/pride_aromantic.png | Bin 0 -> 4640 bytes .../item/colorizer/pride_aromantic.png.mcmeta | 131 ++ .../textures/item/colorizer/pride_asexual.png | Bin 0 -> 4695 bytes .../item/colorizer/pride_asexual.png.mcmeta | 135 ++ .../item/colorizer/pride_bisexual.png | Bin 0 -> 4893 bytes .../item/colorizer/pride_bisexual.png.mcmeta | 151 ++ .../textures/item/colorizer/pride_demiboy.png | Bin 0 -> 4644 bytes .../item/colorizer/pride_demiboy.png.mcmeta | 151 ++ .../item/colorizer/pride_demigirl.png | Bin 0 -> 4765 bytes .../item/colorizer/pride_demigirl.png.mcmeta | 151 ++ .../textures/item/colorizer/pride_gay.png | Bin 0 -> 4577 bytes .../item/colorizer/pride_gay.png.mcmeta | 131 ++ .../item/colorizer/pride_genderfluid.png | Bin 0 -> 4588 bytes .../colorizer/pride_genderfluid.png.mcmeta | 131 ++ .../item/colorizer/pride_genderqueer.png | Bin 0 -> 4813 bytes .../colorizer/pride_genderqueer.png.mcmeta | 151 ++ .../item/colorizer/pride_intersex.png | Bin 0 -> 2170 bytes .../item/colorizer/pride_intersex.png.mcmeta | 127 ++ .../textures/item/colorizer/pride_lesbian.png | Bin 0 -> 4700 bytes .../item/colorizer/pride_lesbian.png.mcmeta | 131 ++ .../item/colorizer/pride_nonbinary.png | Bin 0 -> 4733 bytes .../item/colorizer/pride_nonbinary.png.mcmeta | 135 ++ .../item/colorizer/pride_pansexual.png | Bin 0 -> 4771 bytes .../item/colorizer/pride_pansexual.png.mcmeta | 151 ++ .../textures/item/colorizer/pride_plural.png | Bin 0 -> 4645 bytes .../item/colorizer/pride_plural.png.mcmeta | 135 ++ .../item/colorizer/pride_transgender.png | Bin 0 -> 4858 bytes .../colorizer/pride_transgender.png.mcmeta | 151 ++ .../textures/item/colorizer/uuid.png | Bin 0 -> 1984 bytes .../textures/item/colorizer/uuid.png.mcmeta | 87 ++ .../textures/item/creative_unlocker.png | Bin 0 -> 250 bytes .../hexcasting/textures/item/cypher.png | Bin 0 -> 326 bytes .../textures/item/cypher_filled.png | Bin 0 -> 395 bytes .../hexcasting/textures/item/edified_door.png | Bin 0 -> 185 bytes .../hexcasting/textures/item/focus_base.png | Bin 0 -> 417 bytes .../textures/item/focus_base_sealed.png | Bin 0 -> 305 bytes .../hexcasting/textures/item/focus_empty.png | Bin 0 -> 415 bytes .../textures/item/focus_overlay.png | Bin 0 -> 152 bytes .../textures/item/focus_overlay_sealed.png | Bin 0 -> 229 bytes .../textures/item/jeweler_hammer.png | Bin 0 -> 226 bytes .../assets/hexcasting/textures/item/lens.png | Bin 0 -> 4404 bytes .../textures/item/lore_fragment.png | Bin 0 -> 465 bytes .../textures/item/patchouli_book.png | Bin 0 -> 412 bytes .../textures/item/phial/phial_large_0.png | Bin 0 -> 254 bytes .../textures/item/phial/phial_large_1.png | Bin 0 -> 320 bytes .../textures/item/phial/phial_large_2.png | Bin 0 -> 399 bytes .../textures/item/phial/phial_large_3.png | Bin 0 -> 406 bytes .../textures/item/phial/phial_large_4.png | Bin 0 -> 393 bytes .../textures/item/phial/phial_medium_0.png | Bin 0 -> 256 bytes .../textures/item/phial/phial_medium_1.png | Bin 0 -> 283 bytes .../textures/item/phial/phial_medium_2.png | Bin 0 -> 308 bytes .../textures/item/phial/phial_medium_3.png | Bin 0 -> 318 bytes .../textures/item/phial/phial_medium_4.png | Bin 0 -> 346 bytes .../textures/item/phial/phial_small_0.png | Bin 0 -> 204 bytes .../textures/item/phial/phial_small_1.png | Bin 0 -> 216 bytes .../textures/item/phial/phial_small_2.png | Bin 0 -> 240 bytes .../textures/item/phial/phial_small_3.png | Bin 0 -> 251 bytes .../textures/item/phial/phial_small_4.png | Bin 0 -> 283 bytes .../textures/item/scroll_ancient_large.png | Bin 0 -> 445 bytes .../textures/item/scroll_ancient_medium.png | Bin 0 -> 411 bytes .../textures/item/scroll_ancient_small.png | Bin 0 -> 331 bytes .../textures/item/scroll_pristine_large.png | Bin 0 -> 417 bytes .../textures/item/scroll_pristine_medium.png | Bin 0 -> 335 bytes .../textures/item/scroll_pristine_small.png | Bin 0 -> 344 bytes .../hexcasting/textures/item/slate_blank.png | Bin 0 -> 348 bytes .../textures/item/slate_written.png | Bin 0 -> 443 bytes .../textures/item/spellbook_base.png | Bin 0 -> 3075 bytes .../textures/item/spellbook_base_sealed.png | Bin 0 -> 3086 bytes .../textures/item/spellbook_empty.png | Bin 0 -> 3043 bytes .../textures/item/spellbook_overlay.png | Bin 0 -> 2786 bytes .../item/spellbook_overlay_sealed.png | Bin 0 -> 2820 bytes .../textures/item/staves/acacia.png | Bin 0 -> 316 bytes .../hexcasting/textures/item/staves/birch.png | Bin 0 -> 345 bytes .../textures/item/staves/bosnia.png | Bin 0 -> 442 bytes .../textures/item/staves/crimson.png | Bin 0 -> 2060 bytes .../textures/item/staves/dark_oak.png | Bin 0 -> 341 bytes .../textures/item/staves/edified.png | Bin 0 -> 330 bytes .../textures/item/staves/jungle.png | Bin 0 -> 380 bytes .../hexcasting/textures/item/staves/oak.png | Bin 0 -> 337 bytes .../hexcasting/textures/item/staves/old.png | Bin 0 -> 329 bytes .../textures/item/staves/spruce.png | Bin 0 -> 318 bytes .../textures/item/staves/warped.png | Bin 0 -> 1619 bytes .../hexcasting/textures/item/sub_sandwich.png | Bin 0 -> 515 bytes .../hexcasting/textures/item/trinket.png | Bin 0 -> 347 bytes .../textures/item/trinket_filled.png | Bin 0 -> 405 bytes .../hexcasting/textures/main_hex.aseprite | Bin 0 -> 86830 bytes .../hexcasting/textures/particle/cloud.png | Bin 0 -> 743 bytes .../textures/particle/spin_cube_1.png | Bin 0 -> 148 bytes .../textures/particle/spin_cube_2.png | Bin 0 -> 138 bytes .../textures/particle/spin_cube_3.png | Bin 0 -> 147 bytes .../textures/particle/spin_cube_4.png | Bin 0 -> 148 bytes .../textures/particle/spin_cube_5.png | Bin 0 -> 148 bytes .../textures/particle/spin_cube_6.png | Bin 0 -> 148 bytes .../textures/particle/spin_cube_7.png | Bin 0 -> 148 bytes .../textures/particle/spin_cube_8.png | Bin 0 -> 149 bytes .../shaders/core/hexcasting__grayscale.fsh | 32 + .../shaders/core/hexcasting__grayscale.json | 34 + .../advancements/grant_patchi_book.json | 12 + .../amethyst_shard_reducer.json | 4 + .../loot_tables/grant_patchi_book.json | 20 + .../patchouli_books/thehexbook/book.json | 25 + .../thehexbook/en_us/categories/basics.json | 6 + .../thehexbook/en_us/categories/casting.json | 6 + .../en_us/categories/greatwork.json | 6 + .../thehexbook/en_us/categories/interop.json | 8 + .../thehexbook/en_us/categories/items.json | 6 + .../thehexbook/en_us/categories/lore.json | 6 + .../thehexbook/en_us/categories/patterns.json | 6 + .../categories/patterns/great_spells.json | 7 + .../en_us/categories/patterns/spells.json | 7 + .../en_us/entries/basics/couldnt_cast.json | 25 + .../en_us/entries/basics/geodes.json | 22 + .../en_us/entries/basics/media.json | 21 + .../en_us/entries/basics/start_to_see.json | 25 + .../thehexbook/en_us/entries/casting/101.json | 83 ++ .../en_us/entries/casting/influences.json | 21 + .../en_us/entries/casting/mishaps.json | 92 ++ .../en_us/entries/casting/mishaps2.json | 29 + .../en_us/entries/casting/naming.json | 21 + .../en_us/entries/casting/stack.json | 25 + .../en_us/entries/casting/vectors.json | 26 + .../en_us/entries/greatwork/akashiclib.json | 32 + .../entries/greatwork/brainsweeping.json | 27 + .../en_us/entries/greatwork/directrix.json | 28 + .../en_us/entries/greatwork/impetus.json | 50 + .../en_us/entries/greatwork/spellcircles.json | 44 + .../en_us/entries/greatwork/the_work.json | 18 + .../en_us/entries/interop/gravity.json | 26 + .../en_us/entries/interop/interop.json | 11 + .../en_us/entries/interop/pehkui.json | 26 + .../en_us/entries/items/abacus.json | 22 + .../en_us/entries/items/amethyst.json | 35 + .../en_us/entries/items/decoration.json | 48 + .../en_us/entries/items/edified.json | 55 + .../thehexbook/en_us/entries/items/focus.json | 26 + .../en_us/entries/items/hexcasting.json | 41 + .../en_us/entries/items/jeweler_hammer.json | 18 + .../thehexbook/en_us/entries/items/lens.json | 22 + .../en_us/entries/items/phials.json | 28 + .../en_us/entries/items/pigments.json | 78 ++ .../en_us/entries/items/scroll.json | 21 + .../thehexbook/en_us/entries/items/slate.json | 26 + .../en_us/entries/items/spellbook.json | 22 + .../thehexbook/en_us/entries/items/staff.json | 30 + .../en_us/entries/lore/experiment1.json | 15 + .../en_us/entries/lore/experiment2.json | 13 + .../en_us/entries/lore/inventory.json | 22 + .../en_us/entries/lore/terabithia1.json | 17 + .../en_us/entries/lore/terabithia2.json | 16 + .../en_us/entries/lore/terabithia3.json | 21 + .../en_us/entries/lore/terabithia4.json | 19 + .../en_us/entries/lore/terabithia5.json | 14 + .../en_us/entries/patterns/advanced_math.json | 66 + .../entries/patterns/akashic_patterns.json | 26 + .../en_us/entries/patterns/basics.json | 98 ++ .../en_us/entries/patterns/circle.json | 46 + .../en_us/entries/patterns/consts.json | 126 ++ .../en_us/entries/patterns/entities.json | 146 ++ .../patterns/great_spells/brainsweep.json | 18 + .../patterns/great_spells/create_lava.json | 22 + .../entries/patterns/great_spells/flight.json | 22 + .../great_spells/greater_sentinel.json | 22 + .../patterns/great_spells/make_battery.json | 22 + .../patterns/great_spells/teleport.json | 23 + .../patterns/great_spells/weather_manip.json | 37 + .../patterns/great_spells/zeniths.json | 54 + .../en_us/entries/patterns/lists.json | 130 ++ .../en_us/entries/patterns/logic.json | 106 ++ .../en_us/entries/patterns/math.json | 145 ++ .../en_us/entries/patterns/meta.json | 44 + .../en_us/entries/patterns/numbers.json | 72 + .../entries/patterns/patterns_as_iotas.json | 56 + .../en_us/entries/patterns/readers_guide.json | 25 + .../en_us/entries/patterns/readwrite.json | 98 ++ .../en_us/entries/patterns/sets.json | 69 + .../en_us/entries/patterns/spells/basic.json | 62 + .../entries/patterns/spells/blockworks.json | 90 ++ .../entries/patterns/spells/colorize.json | 18 + .../entries/patterns/spells/hexcasting.json | 64 + .../entries/patterns/spells/itempicking.json | 22 + .../en_us/entries/patterns/spells/nadirs.json | 58 + .../entries/patterns/spells/sentinels.json | 50 + .../en_us/entries/patterns/stackmanip.json | 158 +++ .../en_us/templates/brainsweep.json | 53 + .../en_us/templates/crafting_multi.json | 113 ++ .../en_us/templates/manual_pattern.json | 34 + .../en_us/templates/manual_pattern_nosig.json | 28 + .../thehexbook/en_us/templates/pattern.json | 34 + .../data/hexcasting/recipes/patchi_book.json | 12 + .../tags/entity_types/cannot_teleport.json | 36 + .../tags/entity_types/sticky_teleporters.json | 30 + .../tags/items/cluster_max_harvestables.json | 94 ++ .../src/main/resources/hexplat.accesswidener | 7 + .../src/main/resources/hexplat.mixins.json | 29 + 0.10.3/Common/src/main/resources/logo.png | Bin 0 -> 37749 bytes 0.10.3/Common/src/main/resources/pack.mcmeta | 6 + .../src/test/java/EulerPathFinderTest.kt | 16 + ...WhatRangeDoTheNoisesOutputAnywaysTest.java | 39 + 0.10.3/Fabric/build.gradle | 140 ++ 0.10.3/Fabric/gradle.properties | 19 + .../data/c/tags/items/amethyst_dusts.json | 6 + .../resources/data/c/tags/items/gems.json | 6 + .../recipes/crushing/amethyst_block.json | 28 + .../recipes/crushing/amethyst_cluster.json | 31 + .../brainsweep/brainsweep/akashic_record.json | 34 + .../brainsweep/budding_amethyst.json | 34 + .../brainsweep/directrix_redstone.json | 34 + .../brainsweep/brainsweep/impetus_look.json | 34 + .../brainsweep/impetus_rightclick.json | 34 + .../brainsweep/impetus_storedplayer.json | 34 + .../hexcasting.creative_tab/abacus.json | 32 + .../hexcasting.creative_tab/acacia_staff.json | 34 + .../ageing_scroll_paper_lantern.json | 34 + .../akashic_bookshelf.json | 34 + .../akashic_connector.json | 34 + .../amethyst_dust_packing.json | 34 + .../amethyst_dust_unpacking.json | 34 + .../amethyst_sconce.json | 34 + .../amethyst_tiles.json | 34 + .../ancient_scroll_paper.json | 34 + .../ancient_scroll_paper_lantern.json | 34 + .../hexcasting.creative_tab/artifact.json | 32 + .../hexcasting.creative_tab/birch_staff.json | 34 + .../crimson_staff.json | 34 + .../hexcasting.creative_tab/cypher.json | 32 + .../dark_oak_staff.json | 34 + .../dye_colorizer_black.json | 34 + .../dye_colorizer_blue.json | 34 + .../dye_colorizer_brown.json | 34 + .../dye_colorizer_cyan.json | 34 + .../dye_colorizer_gray.json | 34 + .../dye_colorizer_green.json | 34 + .../dye_colorizer_light_blue.json | 34 + .../dye_colorizer_light_gray.json | 34 + .../dye_colorizer_lime.json | 34 + .../dye_colorizer_magenta.json | 34 + .../dye_colorizer_orange.json | 34 + .../dye_colorizer_pink.json | 34 + .../dye_colorizer_purple.json | 34 + .../dye_colorizer_red.json | 34 + .../dye_colorizer_white.json | 34 + .../dye_colorizer_yellow.json | 34 + .../edified_button.json | 32 + .../hexcasting.creative_tab/edified_door.json | 32 + .../edified_panel.json | 32 + .../edified_planks.json | 32 + .../edified_pressure_plate.json | 32 + .../hexcasting.creative_tab/edified_slab.json | 32 + .../edified_staff.json | 34 + .../edified_stairs.json | 32 + .../hexcasting.creative_tab/edified_tile.json | 32 + .../edified_trapdoor.json | 32 + .../hexcasting.creative_tab/edified_wood.json | 34 + .../empty_directrix.json | 34 + .../empty_impetus.json | 34 + .../hexcasting.creative_tab/focus.json | 32 + .../jeweler_hammer.json | 34 + .../hexcasting.creative_tab/jungle_staff.json | 34 + .../recipes/hexcasting.creative_tab/lens.json | 32 + .../hexcasting.creative_tab/oak_staff.json | 34 + .../pride_colorizer_agender.json | 34 + .../pride_colorizer_aroace.json | 34 + .../pride_colorizer_aromantic.json | 34 + .../pride_colorizer_asexual.json | 34 + .../pride_colorizer_bisexual.json | 34 + .../pride_colorizer_demiboy.json | 34 + .../pride_colorizer_demigirl.json | 34 + .../pride_colorizer_gay.json | 34 + .../pride_colorizer_genderfluid.json | 34 + .../pride_colorizer_genderqueer.json | 34 + .../pride_colorizer_intersex.json | 34 + .../pride_colorizer_lesbian.json | 34 + .../pride_colorizer_nonbinary.json | 34 + .../pride_colorizer_pansexual.json | 34 + .../pride_colorizer_plural.json | 34 + .../pride_colorizer_transgender.json | 34 + .../hexcasting.creative_tab/scroll.json | 34 + .../scroll_medium.json | 34 + .../hexcasting.creative_tab/scroll_paper.json | 34 + .../scroll_paper_lantern.json | 34 + .../hexcasting.creative_tab/scroll_small.json | 34 + .../hexcasting.creative_tab/slate.json | 34 + .../hexcasting.creative_tab/slate_block.json | 34 + .../slate_block_from_slates.json | 34 + .../hexcasting.creative_tab/spellbook.json | 47 + .../hexcasting.creative_tab/spruce_staff.json | 34 + .../stonecutting/amethyst_tiles.json | 34 + .../stripped_edified_wood.json | 34 + .../hexcasting.creative_tab/sub_sandwich.json | 34 + .../hexcasting.creative_tab/trinket.json | 32 + .../uuid_colorizer.json | 34 + .../hexcasting.creative_tab/warped_staff.json | 34 + .../loot_tables/blocks/akashic_bookshelf.json | 15 + .../loot_tables/blocks/akashic_connector.json | 15 + .../loot_tables/blocks/akashic_record.json | 15 + .../blocks/amethyst_dust_block.json | 15 + .../blocks/amethyst_edified_leaves.json | 54 + .../loot_tables/blocks/amethyst_sconce.json | 15 + .../loot_tables/blocks/amethyst_tiles.json | 15 + .../blocks/ancient_scroll_paper.json | 15 + .../blocks/ancient_scroll_paper_lantern.json | 15 + .../blocks/aventurine_edified_leaves.json | 54 + .../blocks/citrine_edified_leaves.json | 54 + .../blocks/directrix_redstone.json | 15 + .../loot_tables/blocks/edified_button.json | 15 + .../loot_tables/blocks/edified_door.json | 24 + .../loot_tables/blocks/edified_log.json | 15 + .../loot_tables/blocks/edified_panel.json | 15 + .../loot_tables/blocks/edified_planks.json | 15 + .../blocks/edified_pressure_plate.json | 15 + .../loot_tables/blocks/edified_slab.json | 34 + .../loot_tables/blocks/edified_stairs.json | 15 + .../loot_tables/blocks/edified_tile.json | 15 + .../loot_tables/blocks/edified_trapdoor.json | 15 + .../loot_tables/blocks/edified_wood.json | 15 + .../loot_tables/blocks/empty_directrix.json | 15 + .../loot_tables/blocks/empty_impetus.json | 15 + .../loot_tables/blocks/impetus_look.json | 15 + .../blocks/impetus_rightclick.json | 15 + .../blocks/impetus_storedplayer.json | 15 + .../loot_tables/blocks/scroll_paper.json | 15 + .../blocks/scroll_paper_lantern.json | 15 + .../hexcasting/loot_tables/blocks/slate.json | 28 + .../loot_tables/blocks/slate_block.json | 15 + .../blocks/stripped_edified_log.json | 15 + .../blocks/stripped_edified_wood.json | 15 + .../loot_tables/inject/amethyst_cluster.json | 190 +++ .../loot_tables/inject/scroll_loot_few.json | 23 + .../loot_tables/inject/scroll_loot_many.json | 23 + .../loot_tables/inject/scroll_loot_some.json | 23 + .../data/hexcasting/recipes/abacus.json | 22 + .../data/hexcasting/recipes/acacia_staff.json | 22 + .../recipes/ageing_scroll_paper_lantern.json | 44 + .../hexcasting/recipes/akashic_bookshelf.json | 22 + .../hexcasting/recipes/akashic_connector.json | 22 + .../recipes/amethyst_dust_packing.json | 15 + .../recipes/amethyst_dust_unpacking.json | 12 + .../hexcasting/recipes/amethyst_sconce.json | 24 + .../hexcasting/recipes/amethyst_tiles.json | 23 + .../recipes/ancient_scroll_paper.json | 44 + .../recipes/ancient_scroll_paper_lantern.json | 18 + .../data/hexcasting/recipes/artifact.json | 27 + .../data/hexcasting/recipes/birch_staff.json | 22 + .../recipes/brainsweep/akashic_record.json | 14 + .../recipes/brainsweep/budding_amethyst.json | 13 + .../brainsweep/directrix_redstone.json | 19 + .../recipes/brainsweep/impetus_look.json | 18 + .../brainsweep/impetus_rightclick.json | 18 + .../brainsweep/impetus_storedplayer.json | 19 + .../create/crushing/amethyst_shard.json | 27 + .../farmersdelight/cutting/akashic_door.json | 25 + .../farmersdelight/cutting/akashic_log.json | 29 + .../cutting/akashic_trapdoor.json | 25 + .../farmersdelight/cutting/akashic_wood.json | 29 + .../hexcasting/recipes/crimson_staff.json | 22 + .../data/hexcasting/recipes/cypher.json | 24 + .../hexcasting/recipes/dark_oak_staff.json | 22 + .../recipes/dye_colorizer_black.json | 19 + .../recipes/dye_colorizer_blue.json | 19 + .../recipes/dye_colorizer_brown.json | 19 + .../recipes/dye_colorizer_cyan.json | 19 + .../recipes/dye_colorizer_gray.json | 19 + .../recipes/dye_colorizer_green.json | 19 + .../recipes/dye_colorizer_light_blue.json | 19 + .../recipes/dye_colorizer_light_gray.json | 19 + .../recipes/dye_colorizer_lime.json | 19 + .../recipes/dye_colorizer_magenta.json | 19 + .../recipes/dye_colorizer_orange.json | 19 + .../recipes/dye_colorizer_pink.json | 19 + .../recipes/dye_colorizer_purple.json | 19 + .../hexcasting/recipes/dye_colorizer_red.json | 19 + .../recipes/dye_colorizer_white.json | 19 + .../recipes/dye_colorizer_yellow.json | 19 + .../recipes/dynamic/seal_focus.json | 3 + .../recipes/dynamic/seal_spellbook.json | 3 + .../hexcasting/recipes/edified_button.json | 11 + .../data/hexcasting/recipes/edified_door.json | 17 + .../hexcasting/recipes/edified_panel.json | 20 + .../hexcasting/recipes/edified_planks.json | 12 + .../recipes/edified_pressure_plate.json | 14 + .../data/hexcasting/recipes/edified_slab.json | 15 + .../hexcasting/recipes/edified_staff.json | 22 + .../hexcasting/recipes/edified_stairs.json | 17 + .../data/hexcasting/recipes/edified_tile.json | 17 + .../hexcasting/recipes/edified_trapdoor.json | 16 + .../data/hexcasting/recipes/edified_wood.json | 16 + .../hexcasting/recipes/empty_directrix.json | 25 + .../hexcasting/recipes/empty_impetus.json | 25 + .../data/hexcasting/recipes/focus.json | 27 + .../hexcasting/recipes/jeweler_hammer.json | 40 + .../data/hexcasting/recipes/jungle_staff.json | 22 + .../data/hexcasting/recipes/lens.json | 19 + .../data/hexcasting/recipes/oak_staff.json | 22 + .../recipes/pride_colorizer_agender.json | 19 + .../recipes/pride_colorizer_aroace.json | 19 + .../recipes/pride_colorizer_aromantic.json | 19 + .../recipes/pride_colorizer_asexual.json | 19 + .../recipes/pride_colorizer_bisexual.json | 19 + .../recipes/pride_colorizer_demiboy.json | 19 + .../recipes/pride_colorizer_demigirl.json | 19 + .../recipes/pride_colorizer_gay.json | 19 + .../recipes/pride_colorizer_genderfluid.json | 19 + .../recipes/pride_colorizer_genderqueer.json | 19 + .../recipes/pride_colorizer_intersex.json | 19 + .../recipes/pride_colorizer_lesbian.json | 19 + .../recipes/pride_colorizer_nonbinary.json | 19 + .../recipes/pride_colorizer_pansexual.json | 26 + .../recipes/pride_colorizer_plural.json | 19 + .../recipes/pride_colorizer_transgender.json | 19 + .../data/hexcasting/recipes/scroll.json | 19 + .../hexcasting/recipes/scroll_medium.json | 19 + .../data/hexcasting/recipes/scroll_paper.json | 23 + .../recipes/scroll_paper_lantern.json | 18 + .../data/hexcasting/recipes/scroll_small.json | 18 + .../data/hexcasting/recipes/slate.json | 19 + .../data/hexcasting/recipes/slate_block.json | 23 + .../recipes/slate_block_from_slates.json | 15 + .../data/hexcasting/recipes/spellbook.json | 30 + .../data/hexcasting/recipes/spruce_staff.json | 22 + .../recipes/stonecutting/amethyst_tiles.json | 8 + .../recipes/stripped_edified_wood.json | 16 + .../data/hexcasting/recipes/sub_sandwich.json | 25 + .../data/hexcasting/recipes/trinket.json | 24 + .../hexcasting/recipes/uuid_colorizer.json | 22 + .../data/hexcasting/recipes/warped_staff.json | 22 + .../hexcasting/tags/blocks/edified_logs.json | 9 + .../tags/blocks/edified_planks.json | 8 + .../hexcasting/tags/items/edified_logs.json | 9 + .../hexcasting/tags/items/edified_planks.json | 8 + .../tags/items/grants_root_advancement.json | 8 + .../hexcasting/tags/items/phial_base.json | 6 + .../data/hexcasting/tags/items/staves.json | 14 + .../data/minecraft/tags/blocks/buttons.json | 6 + .../tags/blocks/crystal_sound_blocks.json | 9 + .../data/minecraft/tags/blocks/doors.json | 6 + .../data/minecraft/tags/blocks/leaves.json | 8 + .../data/minecraft/tags/blocks/logs.json | 9 + .../minecraft/tags/blocks/logs_that_burn.json | 9 + .../minecraft/tags/blocks/mineable/axe.json | 19 + .../minecraft/tags/blocks/mineable/hoe.json | 8 + .../tags/blocks/mineable/pickaxe.json | 15 + .../tags/blocks/mineable/shovel.json | 6 + .../data/minecraft/tags/blocks/planks.json | 8 + .../tags/blocks/pressure_plates.json | 6 + .../data/minecraft/tags/blocks/slabs.json | 6 + .../data/minecraft/tags/blocks/trapdoors.json | 6 + .../minecraft/tags/blocks/wooden_buttons.json | 6 + .../minecraft/tags/blocks/wooden_doors.json | 6 + .../tags/blocks/wooden_pressure_plates.json | 6 + .../minecraft/tags/blocks/wooden_slabs.json | 6 + .../tags/blocks/wooden_trapdoors.json | 6 + .../data/minecraft/tags/items/buttons.json | 6 + .../data/minecraft/tags/items/doors.json | 6 + .../data/minecraft/tags/items/leaves.json | 8 + .../data/minecraft/tags/items/logs.json | 9 + .../minecraft/tags/items/logs_that_burn.json | 9 + .../data/minecraft/tags/items/planks.json | 8 + .../data/minecraft/tags/items/slabs.json | 6 + .../data/minecraft/tags/items/trapdoors.json | 6 + .../minecraft/tags/items/wooden_buttons.json | 6 + .../minecraft/tags/items/wooden_doors.json | 6 + .../tags/items/wooden_pressure_plates.json | 6 + .../minecraft/tags/items/wooden_slabs.json | 6 + .../tags/items/wooden_trapdoors.json | 6 + .../fabric/FabricHexClientInitializer.kt | 66 + .../hexcasting/fabric/FabricHexConfig.java | 208 +++ .../hexcasting/fabric/FabricHexInitializer.kt | 162 +++ .../hexcasting/fabric/cc/CCBrainswept.java | 46 + .../fabric/cc/CCFavoredColorizer.java | 41 + .../petrak/hexcasting/fabric/cc/CCFlight.java | 61 + .../hexcasting/fabric/cc/CCHarness.java | 43 + .../hexcasting/fabric/cc/CCPatterns.java | 55 + .../hexcasting/fabric/cc/CCSentinel.java | 59 + .../fabric/cc/HexCardinalComponents.java | 103 ++ .../fabric/cc/adimpl/CCColorizer.java | 37 + .../fabric/cc/adimpl/CCEntityIotaHolder.java | 49 + .../fabric/cc/adimpl/CCHexHolder.java | 57 + .../fabric/cc/adimpl/CCIotaHolder.java | 7 + .../fabric/cc/adimpl/CCItemIotaHolder.java | 67 + .../fabric/cc/adimpl/CCMediaHolder.java | 132 ++ .../hexcasting/fabric/cc/package-info.java | 8 + .../fabric/client/ExtendedTexture.java | 8 + .../datagen/HexFabricConditionsBuilder.java | 96 ++ .../datagen/HexFabricDataGenerators.java | 149 ++ .../fabric/event/MouseScrollCallback.java | 23 + .../event/VillagerConversionCallback.java | 23 + .../fabric/interop/ModMenuInterop.java | 16 + .../interop/emi/EmiBrainsweepRecipe.java | 61 + .../fabric/interop/emi/EmiEdifyRecipe.java | 81 ++ .../fabric/interop/emi/EmiLevelupRecipe.java | 25 + .../fabric/interop/emi/EmiPhialRecipe.java | 84 ++ .../interop/emi/EmiProfessionRecipe.java | 16 + .../fabric/interop/emi/EmiVillagerRecipe.java | 71 + .../fabric/interop/emi/HexEMIPlugin.java | 124 ++ .../interop/emi/PatternRendererEMI.java | 62 + .../interop/emi/TheCoolerSlotWidget.java | 67 + .../fabric/interop/emi/VillagerEmiStack.java | 224 +++ .../fabric/interop/emi/VillagerVariant.java | 7 + .../interop/gravity/GravityApiInterop.java | 20 + .../fabric/interop/gravity/OpChangeGravity.kt | 33 + .../fabric/interop/gravity/OpGetGravity.kt | 19 + .../interop/trinkets/LensTrinketRenderer.java | 52 + .../interop/trinkets/TrinketsApiInterop.java | 61 + .../fabric/mixin/FabricAxeItemMixin.java | 25 + .../mixin/FabricBlockBehaviorMixin.java | 23 + .../FabricEnchantmentTableBlockMixin.java | 23 + .../fabric/mixin/FabricItemEntityMixin.java | 18 + .../fabric/mixin/FabricLivingEntityMixin.java | 47 + .../fabric/mixin/FabricMobMixin.java | 21 + .../FabricVillagerTurnIntoWitchMixin.java | 21 + .../client/FabricAbstractTextureMixin.java | 37 + .../mixin/client/FabricMixinGameRenderer.java | 38 + .../mixin/client/FabricMouseHandlerMixin.java | 20 + .../client/FabricParticleEngineMixin.java | 30 + .../fabric/network/FabricPacketHandler.java | 50 + .../FabricModConditionalIngredient.java | 114 ++ .../recipe/FabricUnsealedIngredient.java | 106 ++ .../fabric/storage/FabricImpetusStorage.kt | 69 + .../fabric/xplat/FabricClientXplatImpl.java | 80 ++ .../fabric/xplat/FabricXplatImpl.java | 477 +++++++ ....hexcasting.xplat.IClientXplatAbstractions | 1 + ...petrak.hexcasting.xplat.IXplatAbstractions | 1 + .../item/tag/hexcasting/akashic_logs.json | 3 + .../item/tag/hexcasting/akashic_planks.json | 3 + .../item/tag/hexcasting/phial_base.json | 3 + .../emi/models/item/tag/hexcasting/wands.json | 3 + .../emi/recipe/defaults/hexcasting.json | 153 ++ .../resources/data/trinkets/entities/hex.json | 8 + .../data/trinkets/tags/items/head/face.json | 6 + .../Fabric/src/main/resources/fabric.mod.json | 77 + .../main/resources/fabricasting.accesswidener | 13 + .../main/resources/fabricasting.mixins.json | 22 + 0.10.3/Forge/build.gradle | 214 +++ 0.10.3/Forge/gradle.properties | 5 + .../recipes/crushing/amethyst_block.json | 33 + .../recipes/crushing/amethyst_cluster.json | 36 + .../data/forge/tags/items/dusts/amethyst.json | 5 + .../resources/data/forge/tags/items/gems.json | 5 + .../brainsweep/brainsweep/akashic_record.json | 34 + .../brainsweep/budding_amethyst.json | 34 + .../brainsweep/directrix_redstone.json | 34 + .../brainsweep/brainsweep/impetus_look.json | 34 + .../brainsweep/impetus_rightclick.json | 34 + .../brainsweep/impetus_storedplayer.json | 34 + .../recipes/hexcasting/abacus.json | 32 + .../recipes/hexcasting/acacia_staff.json | 34 + .../ageing_scroll_paper_lantern.json | 34 + .../recipes/hexcasting/akashic_bookshelf.json | 34 + .../recipes/hexcasting/akashic_connector.json | 34 + .../hexcasting/amethyst_dust_packing.json | 34 + .../hexcasting/amethyst_dust_unpacking.json | 34 + .../recipes/hexcasting/amethyst_sconce.json | 34 + .../recipes/hexcasting/amethyst_tiles.json | 34 + .../hexcasting/ancient_scroll_paper.json | 34 + .../ancient_scroll_paper_lantern.json | 34 + .../recipes/hexcasting/artifact.json | 32 + .../recipes/hexcasting/birch_staff.json | 34 + .../recipes/hexcasting/crimson_staff.json | 34 + .../recipes/hexcasting/cypher.json | 32 + .../recipes/hexcasting/dark_oak_staff.json | 34 + .../hexcasting/dye_colorizer_black.json | 34 + .../hexcasting/dye_colorizer_blue.json | 34 + .../hexcasting/dye_colorizer_brown.json | 34 + .../hexcasting/dye_colorizer_cyan.json | 34 + .../hexcasting/dye_colorizer_gray.json | 34 + .../hexcasting/dye_colorizer_green.json | 34 + .../hexcasting/dye_colorizer_light_blue.json | 34 + .../hexcasting/dye_colorizer_light_gray.json | 34 + .../hexcasting/dye_colorizer_lime.json | 34 + .../hexcasting/dye_colorizer_magenta.json | 34 + .../hexcasting/dye_colorizer_orange.json | 34 + .../hexcasting/dye_colorizer_pink.json | 34 + .../hexcasting/dye_colorizer_purple.json | 34 + .../recipes/hexcasting/dye_colorizer_red.json | 34 + .../hexcasting/dye_colorizer_white.json | 34 + .../hexcasting/dye_colorizer_yellow.json | 34 + .../recipes/hexcasting/edified_button.json | 32 + .../recipes/hexcasting/edified_door.json | 32 + .../recipes/hexcasting/edified_panel.json | 32 + .../recipes/hexcasting/edified_planks.json | 32 + .../hexcasting/edified_pressure_plate.json | 32 + .../recipes/hexcasting/edified_slab.json | 32 + .../recipes/hexcasting/edified_staff.json | 34 + .../recipes/hexcasting/edified_stairs.json | 32 + .../recipes/hexcasting/edified_tile.json | 32 + .../recipes/hexcasting/edified_trapdoor.json | 32 + .../recipes/hexcasting/edified_wood.json | 34 + .../recipes/hexcasting/empty_directrix.json | 34 + .../recipes/hexcasting/empty_impetus.json | 34 + .../recipes/hexcasting/focus.json | 32 + .../recipes/hexcasting/jeweler_hammer.json | 34 + .../recipes/hexcasting/jungle_staff.json | 34 + .../advancements/recipes/hexcasting/lens.json | 32 + .../recipes/hexcasting/oak_staff.json | 34 + .../hexcasting/pride_colorizer_agender.json | 34 + .../hexcasting/pride_colorizer_aroace.json | 34 + .../hexcasting/pride_colorizer_aromantic.json | 34 + .../hexcasting/pride_colorizer_asexual.json | 34 + .../hexcasting/pride_colorizer_bisexual.json | 34 + .../hexcasting/pride_colorizer_demiboy.json | 34 + .../hexcasting/pride_colorizer_demigirl.json | 34 + .../hexcasting/pride_colorizer_gay.json | 34 + .../pride_colorizer_genderfluid.json | 34 + .../pride_colorizer_genderqueer.json | 34 + .../hexcasting/pride_colorizer_intersex.json | 34 + .../hexcasting/pride_colorizer_lesbian.json | 34 + .../hexcasting/pride_colorizer_nonbinary.json | 34 + .../hexcasting/pride_colorizer_pansexual.json | 34 + .../hexcasting/pride_colorizer_plural.json | 34 + .../pride_colorizer_transgender.json | 34 + .../recipes/hexcasting/scroll.json | 34 + .../recipes/hexcasting/scroll_medium.json | 34 + .../recipes/hexcasting/scroll_paper.json | 34 + .../hexcasting/scroll_paper_lantern.json | 34 + .../recipes/hexcasting/scroll_small.json | 34 + .../recipes/hexcasting/slate.json | 34 + .../recipes/hexcasting/slate_block.json | 34 + .../hexcasting/slate_block_from_slates.json | 34 + .../recipes/hexcasting/spellbook.json | 47 + .../recipes/hexcasting/spruce_staff.json | 34 + .../stonecutting/amethyst_tiles.json | 34 + .../hexcasting/stripped_edified_wood.json | 34 + .../recipes/hexcasting/sub_sandwich.json | 34 + .../recipes/hexcasting/trinket.json | 32 + .../recipes/hexcasting/uuid_colorizer.json | 34 + .../recipes/hexcasting/warped_staff.json | 34 + .../loot_tables/blocks/akashic_bookshelf.json | 15 + .../loot_tables/blocks/akashic_connector.json | 15 + .../loot_tables/blocks/akashic_record.json | 15 + .../blocks/amethyst_dust_block.json | 15 + .../blocks/amethyst_edified_leaves.json | 39 + .../loot_tables/blocks/amethyst_sconce.json | 15 + .../loot_tables/blocks/amethyst_tiles.json | 15 + .../blocks/ancient_scroll_paper.json | 15 + .../blocks/ancient_scroll_paper_lantern.json | 15 + .../blocks/aventurine_edified_leaves.json | 39 + .../blocks/citrine_edified_leaves.json | 39 + .../blocks/directrix_redstone.json | 15 + .../loot_tables/blocks/edified_button.json | 15 + .../loot_tables/blocks/edified_door.json | 24 + .../loot_tables/blocks/edified_log.json | 15 + .../loot_tables/blocks/edified_panel.json | 15 + .../loot_tables/blocks/edified_planks.json | 15 + .../blocks/edified_pressure_plate.json | 15 + .../loot_tables/blocks/edified_slab.json | 34 + .../loot_tables/blocks/edified_stairs.json | 15 + .../loot_tables/blocks/edified_tile.json | 15 + .../loot_tables/blocks/edified_trapdoor.json | 15 + .../loot_tables/blocks/edified_wood.json | 15 + .../loot_tables/blocks/empty_directrix.json | 15 + .../loot_tables/blocks/empty_impetus.json | 15 + .../loot_tables/blocks/impetus_look.json | 15 + .../blocks/impetus_rightclick.json | 15 + .../blocks/impetus_storedplayer.json | 15 + .../loot_tables/blocks/scroll_paper.json | 15 + .../blocks/scroll_paper_lantern.json | 15 + .../hexcasting/loot_tables/blocks/slate.json | 28 + .../loot_tables/blocks/slate_block.json | 15 + .../blocks/stripped_edified_log.json | 15 + .../blocks/stripped_edified_wood.json | 15 + .../loot_tables/inject/amethyst_cluster.json | 190 +++ .../loot_tables/inject/scroll_loot_few.json | 23 + .../loot_tables/inject/scroll_loot_many.json | 23 + .../loot_tables/inject/scroll_loot_some.json | 23 + .../data/hexcasting/recipes/abacus.json | 22 + .../data/hexcasting/recipes/acacia_staff.json | 22 + .../recipes/ageing_scroll_paper_lantern.json | 36 + .../hexcasting/recipes/akashic_bookshelf.json | 22 + .../hexcasting/recipes/akashic_connector.json | 22 + .../recipes/amethyst_dust_packing.json | 15 + .../recipes/amethyst_dust_unpacking.json | 12 + .../hexcasting/recipes/amethyst_sconce.json | 19 + .../hexcasting/recipes/amethyst_tiles.json | 23 + .../recipes/ancient_scroll_paper.json | 36 + .../recipes/ancient_scroll_paper_lantern.json | 18 + .../data/hexcasting/recipes/artifact.json | 22 + .../data/hexcasting/recipes/birch_staff.json | 22 + .../recipes/brainsweep/akashic_record.json | 14 + .../recipes/brainsweep/budding_amethyst.json | 13 + .../brainsweep/directrix_redstone.json | 19 + .../recipes/brainsweep/impetus_look.json | 18 + .../brainsweep/impetus_rightclick.json | 18 + .../brainsweep/impetus_storedplayer.json | 19 + .../create/crushing/amethyst_shard.json | 32 + .../farmersdelight/cutting/akashic_door.json | 30 + .../farmersdelight/cutting/akashic_log.json | 34 + .../cutting/akashic_trapdoor.json | 30 + .../farmersdelight/cutting/akashic_wood.json | 34 + .../hexcasting/recipes/crimson_staff.json | 22 + .../data/hexcasting/recipes/cypher.json | 19 + .../hexcasting/recipes/dark_oak_staff.json | 22 + .../recipes/dye_colorizer_black.json | 19 + .../recipes/dye_colorizer_blue.json | 19 + .../recipes/dye_colorizer_brown.json | 19 + .../recipes/dye_colorizer_cyan.json | 19 + .../recipes/dye_colorizer_gray.json | 19 + .../recipes/dye_colorizer_green.json | 19 + .../recipes/dye_colorizer_light_blue.json | 19 + .../recipes/dye_colorizer_light_gray.json | 19 + .../recipes/dye_colorizer_lime.json | 19 + .../recipes/dye_colorizer_magenta.json | 19 + .../recipes/dye_colorizer_orange.json | 19 + .../recipes/dye_colorizer_pink.json | 19 + .../recipes/dye_colorizer_purple.json | 19 + .../hexcasting/recipes/dye_colorizer_red.json | 19 + .../recipes/dye_colorizer_white.json | 19 + .../recipes/dye_colorizer_yellow.json | 19 + .../recipes/dynamic/seal_focus.json | 3 + .../recipes/dynamic/seal_spellbook.json | 3 + .../hexcasting/recipes/edified_button.json | 11 + .../data/hexcasting/recipes/edified_door.json | 17 + .../hexcasting/recipes/edified_panel.json | 20 + .../hexcasting/recipes/edified_planks.json | 12 + .../recipes/edified_pressure_plate.json | 14 + .../data/hexcasting/recipes/edified_slab.json | 15 + .../hexcasting/recipes/edified_staff.json | 22 + .../hexcasting/recipes/edified_stairs.json | 17 + .../data/hexcasting/recipes/edified_tile.json | 17 + .../hexcasting/recipes/edified_trapdoor.json | 16 + .../data/hexcasting/recipes/edified_wood.json | 16 + .../hexcasting/recipes/empty_directrix.json | 25 + .../hexcasting/recipes/empty_impetus.json | 25 + .../data/hexcasting/recipes/focus.json | 22 + .../hexcasting/recipes/jeweler_hammer.json | 30 + .../data/hexcasting/recipes/jungle_staff.json | 22 + .../data/hexcasting/recipes/lens.json | 19 + .../data/hexcasting/recipes/oak_staff.json | 22 + .../recipes/pride_colorizer_agender.json | 19 + .../recipes/pride_colorizer_aroace.json | 19 + .../recipes/pride_colorizer_aromantic.json | 19 + .../recipes/pride_colorizer_asexual.json | 19 + .../recipes/pride_colorizer_bisexual.json | 19 + .../recipes/pride_colorizer_demiboy.json | 19 + .../recipes/pride_colorizer_demigirl.json | 19 + .../recipes/pride_colorizer_gay.json | 19 + .../recipes/pride_colorizer_genderfluid.json | 19 + .../recipes/pride_colorizer_genderqueer.json | 19 + .../recipes/pride_colorizer_intersex.json | 19 + .../recipes/pride_colorizer_lesbian.json | 19 + .../recipes/pride_colorizer_nonbinary.json | 19 + .../recipes/pride_colorizer_pansexual.json | 26 + .../recipes/pride_colorizer_plural.json | 19 + .../recipes/pride_colorizer_transgender.json | 19 + .../data/hexcasting/recipes/scroll.json | 19 + .../hexcasting/recipes/scroll_medium.json | 19 + .../data/hexcasting/recipes/scroll_paper.json | 23 + .../recipes/scroll_paper_lantern.json | 18 + .../data/hexcasting/recipes/scroll_small.json | 18 + .../data/hexcasting/recipes/slate.json | 19 + .../data/hexcasting/recipes/slate_block.json | 23 + .../recipes/slate_block_from_slates.json | 15 + .../data/hexcasting/recipes/spellbook.json | 25 + .../data/hexcasting/recipes/spruce_staff.json | 22 + .../recipes/stonecutting/amethyst_tiles.json | 8 + .../recipes/stripped_edified_wood.json | 16 + .../data/hexcasting/recipes/sub_sandwich.json | 25 + .../data/hexcasting/recipes/trinket.json | 19 + .../hexcasting/recipes/uuid_colorizer.json | 22 + .../data/hexcasting/recipes/warped_staff.json | 22 + .../hexcasting/tags/blocks/edified_logs.json | 8 + .../tags/blocks/edified_planks.json | 7 + .../hexcasting/tags/items/edified_logs.json | 8 + .../hexcasting/tags/items/edified_planks.json | 7 + .../tags/items/grants_root_advancement.json | 7 + .../hexcasting/tags/items/phial_base.json | 5 + .../data/hexcasting/tags/items/staves.json | 13 + .../data/minecraft/tags/blocks/buttons.json | 5 + .../tags/blocks/crystal_sound_blocks.json | 8 + .../data/minecraft/tags/blocks/doors.json | 5 + .../data/minecraft/tags/blocks/leaves.json | 7 + .../data/minecraft/tags/blocks/logs.json | 8 + .../minecraft/tags/blocks/logs_that_burn.json | 8 + .../minecraft/tags/blocks/mineable/axe.json | 18 + .../minecraft/tags/blocks/mineable/hoe.json | 7 + .../tags/blocks/mineable/pickaxe.json | 14 + .../tags/blocks/mineable/shovel.json | 5 + .../data/minecraft/tags/blocks/planks.json | 7 + .../tags/blocks/pressure_plates.json | 5 + .../data/minecraft/tags/blocks/slabs.json | 5 + .../data/minecraft/tags/blocks/trapdoors.json | 5 + .../minecraft/tags/blocks/wooden_buttons.json | 5 + .../minecraft/tags/blocks/wooden_doors.json | 5 + .../tags/blocks/wooden_pressure_plates.json | 5 + .../minecraft/tags/blocks/wooden_slabs.json | 5 + .../tags/blocks/wooden_trapdoors.json | 5 + .../data/minecraft/tags/items/buttons.json | 5 + .../data/minecraft/tags/items/doors.json | 5 + .../data/minecraft/tags/items/leaves.json | 7 + .../data/minecraft/tags/items/logs.json | 8 + .../minecraft/tags/items/logs_that_burn.json | 8 + .../data/minecraft/tags/items/planks.json | 7 + .../data/minecraft/tags/items/slabs.json | 5 + .../data/minecraft/tags/items/trapdoors.json | 5 + .../minecraft/tags/items/wooden_buttons.json | 5 + .../minecraft/tags/items/wooden_doors.json | 5 + .../tags/items/wooden_pressure_plates.json | 5 + .../minecraft/tags/items/wooden_slabs.json | 5 + .../tags/items/wooden_trapdoors.json | 5 + .../forge/ForgeHexArgumentTypeRegistry.java | 34 + .../forge/ForgeHexClientInitializer.java | 102 ++ .../hexcasting/forge/ForgeHexConfig.java | 225 +++ .../hexcasting/forge/ForgeHexInitializer.java | 244 ++++ .../hexcasting/forge/cap/CapSyncers.java | 63 + .../forge/cap/ForgeCapabilityHandler.java | 174 +++ .../forge/cap/ForgeImpetusCapability.java | 53 + .../hexcasting/forge/cap/HexCapabilities.java | 21 + .../forge/cap/adimpl/CapEntityIotaHolder.java | 39 + .../forge/cap/adimpl/CapItemColorizer.java | 16 + .../forge/cap/adimpl/CapItemHexHolder.java | 39 + .../forge/cap/adimpl/CapItemIotaHolder.java | 42 + .../forge/cap/adimpl/CapItemMediaHolder.java | 57 + .../forge/cap/adimpl/CapStaticIotaHolder.java | 33 + .../cap/adimpl/CapStaticMediaHolder.java | 62 + .../datagen/HexForgeConditionsBuilder.java | 63 + .../forge/datagen/HexForgeDataGenerators.java | 147 ++ .../xplat/HexBlockStatesAndModels.java | 368 +++++ .../forge/datagen/xplat/HexItemModels.java | 223 +++ .../interop/curios/CuriosApiInterop.java | 90 ++ .../forge/interop/curios/CuriosRenderers.java | 30 + .../interop/curios/LensCurioRenderer.java | 54 + .../interop/jei/BrainsweepRecipeCategory.java | 106 ++ .../interop/jei/EdifyRecipeCategory.java | 74 + .../forge/interop/jei/HexJEIPlugin.java | 81 ++ .../forge/interop/jei/PatternDrawable.java | 64 + .../interop/jei/PhialRecipeCategory.java | 74 + .../forge/mixin/ForgeAccessorRegistry.java | 17 + .../forge/mixin/ForgeMixinBlockColors.java | 16 + .../ForgeMixinCursedRecipeSerializerBase.java | 21 + .../forge/mixin/ForgeMixinItemColors.java | 17 + .../forge/network/ForgePacketHandler.java | 83 ++ .../forge/network/MsgBrainsweepAck.java | 55 + .../forge/network/MsgColorizerUpdateAck.java | 48 + .../network/MsgSentinelStatusUpdateAck.java | 59 + .../recipe/ForgeModConditionalIngredient.java | 114 ++ .../forge/recipe/ForgeUnsealedIngredient.java | 103 ++ .../forge/xplat/ForgeClientXplatImpl.java | 55 + .../forge/xplat/ForgeXplatImpl.java | 498 +++++++ .../resources/META-INF/accesstransformer.cfg | 5 + .../src/main/resources/META-INF/mods.toml | 43 + ....hexcasting.xplat.IClientXplatAbstractions | 1 + ...petrak.hexcasting.xplat.IXplatAbstractions | 1 + .../data/curios/tags/items/head.json | 6 + .../resources/hexcasting_forge.mixins.json | 10 + 0.10.3/doc/properties.toml | 66 + 0.10.3/gradle.properties | 19 + doc/src/hexdoc/__version__.py | 4 +- doc/src/hexdoc/hexcasting/hex_book.py | 42 +- doc/src/hexdoc/hexcasting/hex_recipes.py | 39 +- doc/src/hexdoc/minecraft/i18n.py | 26 +- doc/src/hexdoc/minecraft/recipe/recipes.py | 15 +- doc/src/hexdoc/patchouli/book.py | 23 +- doc/src/hexdoc/patchouli/category.py | 6 +- doc/src/hexdoc/utils/compat.py | 36 + doc/src/hexdoc/utils/resource.py | 1 + doc/src/hexdoc/utils/resource_loader.py | 12 +- pyproject.toml | 1 + 1735 files changed, 61625 insertions(+), 35 deletions(-) create mode 100644 0.10.3/Common/build.gradle create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_bookshelf.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_connector.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_record.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_dust_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_sconce.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_tiles.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/aventurine_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/citrine_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/directrix_redstone.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_button.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_door.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_log.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_panel.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_planks.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_pressure_plate.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_slab.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_stairs.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_tile.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_trapdoor.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_wood.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_directrix.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_impetus.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_look.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_rightclick.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_storedplayer.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper_lantern.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_log.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_wood.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_1.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_2.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_3.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_4.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_empty.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_ligature.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_record.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_dust_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_tiles.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/aventurine_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/citrine_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/conjured.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button_pressed.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left_open.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right_open.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left_open.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right_open.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log_horizontal.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_panel.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_2.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_3.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab_top.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_inner.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_outer.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_tile.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_bottom.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_open.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_top.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood_horizontal.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_x.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_y.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_z.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_x.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_y.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_z.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_down.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_east.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_north.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_south.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_up.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_west.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper_lantern.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/slate_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log_horizontal.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood_horizontal.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/abacus.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/acacia_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_bookshelf.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_connector.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_record.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_sconce.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_tiles.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact_filled.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/aventurine_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/battery.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/birch_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/bosnia_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/charged_amethyst.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/citrine_edified_leaves.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/creative_unlocker.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/crimson_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher_filled.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dark_oak_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/directrix_redstone.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_black.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_blue.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_brown.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_cyan.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_gray.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_green.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_blue.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_gray.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_lime.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_magenta.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_orange.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_pink.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_purple.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_red.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_white.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_yellow.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_button.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_door.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_log.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_panel.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_planks.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_pressure_plate.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_slab.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_stairs.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_tile.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_trapdoor.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_wood.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_directrix.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_impetus.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_filled.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_sealed.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_look.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_rightclick.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_storedplayer.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jeweler_hammer.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jungle_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lens.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lore_fragment.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/oak_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/old_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/patchouli_book.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_0.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_1.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_2.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_3.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_4.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_0.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_1.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_2.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_3.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_4.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_0.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_1.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_2.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_3.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_4.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_agender.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aroace.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aromantic.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_asexual.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_bisexual.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demiboy.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demigirl.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_gay.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderfluid.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderqueer.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_intersex.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_lesbian.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_nonbinary.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_pansexual.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_plural.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_transgender.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_large.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_medium.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_small.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_medium.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper_lantern.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_large.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_medium.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_small.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_small.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_blank.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_block.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_written.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_filled.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_sealed.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spruce_staff.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_log.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_wood.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/sub_sandwich.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket_filled.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/uuid_colorizer.json create mode 100644 0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/warped_staff.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aaa_wasteful_cast.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aab_big_cast.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/enlightenment.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment1.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment2.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/inventory.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia1.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia2.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia3.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia4.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia5.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/opened_eyes.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/root.json create mode 100644 0.10.3/Common/src/generated/resources/data/hexcasting/advancements/y_u_no_cast_angy.json create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/README.md create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/annotations/SoftImplement.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/PatternRegistry.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADColorizer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADHexHolder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADMediaHolder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/package-info.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockAbstractImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/client/ScryingLensOverlayRegistry.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/ColorizerItem.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/HexHolderItem.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/MediaHolderItem.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceOvercast.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceShameOnYou.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DiscoveryHandlers.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/EntityDamageSourceOvercast.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/FrozenColorizer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/HexDamageSources.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/MediaConstants.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/ScrollQuantity.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/TriPredicate.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexApiMessages.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexStatistics.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/FlightAbility.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/Sentinel.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/Action.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ConstMediaAction.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperationResult.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperatorUtils.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ParticleSpray.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/RenderedSpell.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellAction.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellList.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPattern.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPatternType.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpecialPatterns.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpellCircleContext.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/ContinuationFrame.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameEvaluate.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameFinishEval.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameForEach.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FunctionalData.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/SpellContinuation.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/EvalSound.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/OperatorSideEffect.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/BooleanIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/DoubleIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/EntityIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/GarbageIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Iota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/IotaType.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/ListIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/NullIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/PatternIota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Vec3Iota.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/EulerPathFinder.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexAngle.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexCoord.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexDir.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexPattern.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/Mishap.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapAlreadyBrainswept.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBlock.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBrainsweep.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadEntity.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadItem.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadOffhandItem.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDisallowedSpell.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDivideByZero.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEntityTooFarAway.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapError.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEvalTooDeep.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapImmuneEntity.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidIota.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidPattern.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidSpellDatumType.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationInWrongDimension.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationTooFarAway.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoAkashicRecord.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoSpellCircle.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNotEnoughArgs.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapOthersName.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapShameOnYou.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapTooManyCloseParens.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapUnescapedValue.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/MediaHelper.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTDsl.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/PatternNameHelper.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/ClientTickCounter.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/HexAdditionalRenderers.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/RenderLib.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/ShiftScrollListener.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/be/BlockEntityAkashicBookshelfRenderer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/be/BlockEntitySlateRenderer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/entity/WallScrollRenderer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/gui/PatternTooltipComponent.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/ktxt/ClientAccessorWrappers.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/shader/FakeBufferSource.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/shader/HexRenderTypes.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/shader/HexShaders.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/client/sound/GridSoundInstance.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockConjured.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockConjuredLight.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockFlammable.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/AkashicFloodfiller.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicBookshelf.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicLigature.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicRecord.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockEntityAkashicBookshelf.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/behavior/HexComposting.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/behavior/HexStrippables.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockEmptyImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockEntitySlate.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockSlate.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/directrix/BlockEmptyDirectrix.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/directrix/BlockRedstoneDirectrix.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockLookingImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRightClickImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockStoredPlayerImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockAkashicLeaves.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockAkashicLog.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockAxis.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexDoor.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexPressurePlate.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexSlab.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexStairs.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexTrapdoor.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexWoodButton.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockSconce.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/entity/BlockEntityConjured.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/entity/BlockEntityLookingImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/entity/BlockEntityRightClickImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/blocks/entity/BlockEntityStoredPlayerImpetus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/RegisterPatterns.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpBlockAxisRaycast.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpBlockRaycast.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpEntityHeight.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpEntityLook.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpEntityPos.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpEntityRaycast.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/OpEntityVelocity.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/akashic/OpAkashicRead.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/akashic/OpAkashicWrite.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/circles/OpCircleBounds.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/circles/OpImpetusDir.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/circles/OpImpetusPos.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/eval/OpEval.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/eval/OpEvalDelay.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/eval/OpForEach.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/eval/OpHalt.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpAppend.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpConcat.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpCons.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpEmptyList.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpIndex.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpIndexOf.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpLastNToList.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpListSize.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpModifyInPlace.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpRemove.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpReverski.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpSingleton.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpSlice.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpSplat.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/lists/OpUnCons.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/local/OpPeekLocal.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/local/OpPushLocal.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpAbsLen.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpAdd.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpCeil.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpCoerceToAxial.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpConstructVec.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpDeconstructVec.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpDivCross.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpFloor.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpLog.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpModulo.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpMulDot.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpPowProj.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpRandom.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/OpSub.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/bit/OpAnd.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/bit/OpNot.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/bit/OpOr.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/bit/OpToSet.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/bit/OpXor.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpBoolAnd.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpBoolIf.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpBoolNot.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpBoolOr.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpBoolXor.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpCoerceToBool.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpCompare.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/logic/OpEquality.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpArcCos.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpArcSin.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpArcTan.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpArcTan2.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpCos.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpSin.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/math/trig/OpTan.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpRead.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpReadable.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpTheCoolerRead.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpTheCoolerReadable.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpTheCoolerWritable.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpTheCoolerWrite.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpWritable.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/rw/OpWrite.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/selectors/OpGetCaster.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/selectors/OpGetEntitiesBy.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/selectors/OpGetEntityAt.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpAddMotion.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBeep.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBlink.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpBreakBlock.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpColorize.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpConjureBlock.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpCreateFluid.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpDestroyFluid.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpEdifySapling.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpErase.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExplode.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpExtinguish.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpIgnite.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpMakeBattery.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpMakePackagedSpell.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPlaceBlock.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPotionEffect.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpPrint.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpRecharge.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/OpTheOnlyReasonAnyoneDownloadedPsi.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/great/OpBrainsweep.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/great/OpFlight.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/great/OpLightning.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/great/OpTeleport.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/great/OpWeather.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/sentinel/OpCreateSentinel.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/sentinel/OpDestroySentinel.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/sentinel/OpGetSentinelPos.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/spells/sentinel/OpGetSentinelWayfind.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpAlwinfyHasAscendedToABeingOfPureMath.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpBitMask.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpDuplicateN.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpFisherman.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpFishermanButItCopies.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpMask.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpStackSize.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/casting/operators/stack/OpTwiddling.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/command/BrainsweepCommand.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/command/ListPatternsCommand.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/command/PatternResLocArgument.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/command/RecalcPatternsCommand.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/entities/EntityWallScroll.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/entities/HexEntities.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemAbacus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemFocus.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemJewelerHammer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLoreFragment.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemScroll.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemSlate.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemSpellbook.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/colorizer/ItemDyeColorizer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/colorizer/ItemPrideColorizer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/colorizer/ItemUUIDColorizer.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/DebugUnlockerHolder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemArtifact.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCypher.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemMediaBattery.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemMediaHolder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemPackagedHex.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemTrinket.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/loot/AmethystReducerFunc.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/loot/PatternScrollFunc.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/misc/AkashicTreeGrower.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/misc/Brainsweeping.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/misc/PatternTooltip.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/misc/PlayerPositionRecorder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/IMessage.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgBeepAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgBlinkAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgCastParticleAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewSpellPatternSyn.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgNewWallScrollAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgOpenSpellGuiAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgRecalcWallScrollDisplayAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgShiftScrollSyn.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/network/MsgUpdateComparatorVisualsAck.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/BrainsweepRecipe.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/HexRecipeStuffRegistry.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/RecipeSerializerBase.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealFocusRecipe.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealSpellbookRecipe.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredient.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlock.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlockState.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlocks.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientHelper.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientTag.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientTagExcluding.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/VillagerIngredient.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/HexAdvancements.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/HexBlockTagProvider.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/HexItemTagProvider.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/HexLootTables.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/IXplatConditionsBuilder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/IXplatIngredients.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/BrainsweepRecipeBuilder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/CompatIngredientValue.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/CompatProcessingOutput.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/CreateCrushingRecipeBuilder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/FarmersDelightCuttingRecipeBuilder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/FarmersDelightToolIngredient.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/ItemProcessingOutput.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/ProcessingOutput.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/AbstractPatternComponent.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/BrainsweepProcessor.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/CustomComponentTooltip.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/LookupPatternComponent.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/ManualPatternComponent.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/MultiCraftingProcessor.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatchouliUtils.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatternProcessor.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/pehkui/OpGetScale.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/pehkui/OpSetScale.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/pehkui/PehkuiInterop.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/utils/PatternDrawingUtil.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/utils/PatternEntry.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/interop/utils/PhialRecipeStackBuilder.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/ktxt/AccessorWrappers.kt create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/MixinAbstractVillager.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/MixinMob.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/MixinRaider.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/MixinReloadableServerResources.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/MixinVillager.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWitch.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorEntity.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLivingEntity.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLootTable.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorUseOnContext.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorVillager.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/CriteriaTriggersAccessor.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorCompositeRenderType.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorEmptyTextureStateShard.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorMouseHandler.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderStateShard.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderType.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinClientLevel.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/xplat/IClientXplatAbstractions.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/xplat/IForgeLikeBlock.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatTags.java create mode 100644 0.10.3/Common/src/main/java/at/petrak/hexcasting/xplat/Platform.java create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/lang/en_us.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/lang/ru_ru.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/lang/zh_cn.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/models/block/amethyst_sconce.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/models/block/cube_half_mirrored.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/models/block/slate.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/particles/conjure_block_particle.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/particles/conjure_light_particle.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds.json create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/abacus1.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/abacus2.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/abacus3.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/abacus_shake.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/add_line.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/add_pattern.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/cast_hex.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/casting_ambiance.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/fail_pattern.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/hermes.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/sounds/thoth.ogg create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf_horiz.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf_overlay_1.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf_overlay_2.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf_overlay_3.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf_overlay_4.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_bookshelf_vert.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_ligature.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_record.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/akashic_record_inner.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_bricks.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_bricks_small.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_chiseled.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_dust_block.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_edified_leaves.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_polished.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/amethyst_tiles.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/ancient_scroll_paper.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/ancient_scroll_paper_lantern.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/ancient_scroll_paper_lantern_bottom.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/ancient_scroll_paper_lantern_side.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/ancient_scroll_paper_lantern_top.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/aventurine_edified_leaves.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/citrine_edified_leaves.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/arrows.ase create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/empty/end_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/empty/end_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/empty/horiz_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/empty/horiz_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/empty/vert_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/empty/vert_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/back_powered.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/back_unpowered.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/down_powered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/down_powered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/down_unpowered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/down_unpowered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/front_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/front_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/left_powered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/left_powered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/left_unpowered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/left_unpowered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/right_powered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/right_powered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/right_unpowered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/right_unpowered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/up_powered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/up_powered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/up_unpowered_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/directrix/redstone/up_unpowered_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_door_lower.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_door_upper.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_log.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_log_top.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_panel.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_planks.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_planks_2.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_planks_3.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_tile.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/edified_trapdoor.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/atlas.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/back_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/back_empty_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/back_empty_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/back_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/down_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/down_empty_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/down_empty_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/down_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/front_empty_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/front_empty_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/left_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/left_empty_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/left_empty_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/left_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/look_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/look_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/right_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/right_empty_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/right_empty_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/right_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/rightclick_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/rightclick_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/something.ase create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/something.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/storedplayer_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/storedplayer_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/up_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/up_empty_dim.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/up_empty_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/impetus/up_lit.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/scroll_paper.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/scroll_paper_lantern.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/scroll_paper_lantern_bottom.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/scroll_paper_lantern_side.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/scroll_paper_lantern_top.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/slate.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/slate_directional.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/smooth_amethyst.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/stripped_edified_log.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/block/stripped_edified_log_top.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/entity/scroll_ancient_large.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/entity/scroll_ancient_medium.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/entity/scroll_large.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/entity/scroll_medium.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/entity/sentinel.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/entity/white.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/brainsweep.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/brainsweep_emi.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/brainsweep_jei.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/edify.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/edify_emi.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/edify_jei.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/entries/spell_circle.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/patchi_book.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/patchi_filler.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/phial.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/phial_emi.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/phial_jei.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/scroll.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/scroll_ancient.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/slate.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/villager_leveling.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/gui/villager_profession.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/abacus.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/amethyst_dust.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/artifact.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/artifact_filled.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/charged_amethyst.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_black.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_black.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_blue.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_blue.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_brown.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_brown.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_cyan.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_cyan.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_gray.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_gray.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_green.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_green.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_light_blue.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_light_blue.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_light_gray.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_light_gray.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_lime.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_lime.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_magenta.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_magenta.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_orange.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_orange.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_pink.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_pink.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_purple.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_purple.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_red.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_red.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_white.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_white.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_yellow.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/dye_yellow.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_agender.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_agender.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_aroace.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_aroace.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_aromantic.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_aromantic.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_asexual.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_asexual.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_bisexual.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_bisexual.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_demiboy.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_demiboy.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_demigirl.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_demigirl.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_gay.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_gay.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_genderfluid.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_genderfluid.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_genderqueer.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_genderqueer.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_intersex.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_intersex.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_lesbian.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_lesbian.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_nonbinary.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_nonbinary.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_pansexual.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_pansexual.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_plural.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_plural.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_transgender.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/pride_transgender.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/uuid.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/colorizer/uuid.png.mcmeta create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/creative_unlocker.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/cypher.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/cypher_filled.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/edified_door.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/focus_base.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/focus_base_sealed.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/focus_empty.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/focus_overlay.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/focus_overlay_sealed.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/jeweler_hammer.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/lens.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/lore_fragment.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/patchouli_book.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_large_0.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_large_1.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_large_2.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_large_3.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_large_4.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_medium_0.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_medium_1.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_medium_2.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_medium_3.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_medium_4.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_small_0.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_small_1.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_small_2.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_small_3.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/phial/phial_small_4.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_large.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_medium.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/scroll_ancient_small.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/scroll_pristine_large.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/scroll_pristine_medium.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/scroll_pristine_small.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/slate_blank.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/slate_written.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/spellbook_base.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/spellbook_base_sealed.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/spellbook_empty.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/spellbook_overlay.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/spellbook_overlay_sealed.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/acacia.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/birch.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/bosnia.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/crimson.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/dark_oak.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/edified.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/jungle.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/oak.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/old.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/spruce.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/staves/warped.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/sub_sandwich.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/trinket.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/item/trinket_filled.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/main_hex.aseprite create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/cloud.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_1.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_2.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_3.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_4.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_5.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_6.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_7.png create mode 100644 0.10.3/Common/src/main/resources/assets/hexcasting/textures/particle/spin_cube_8.png create mode 100644 0.10.3/Common/src/main/resources/assets/minecraft/shaders/core/hexcasting__grayscale.fsh create mode 100644 0.10.3/Common/src/main/resources/assets/minecraft/shaders/core/hexcasting__grayscale.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/advancements/grant_patchi_book.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/item_modifiers/amethyst_shard_reducer.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/loot_tables/grant_patchi_book.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/basics.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/casting.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/greatwork.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/interop.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/items.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/lore.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/patterns.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/patterns/great_spells.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/categories/patterns/spells.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/basics/couldnt_cast.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/basics/geodes.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/basics/media.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/basics/start_to_see.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/101.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/influences.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/mishaps.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/mishaps2.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/naming.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/stack.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/casting/vectors.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/akashiclib.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/brainsweeping.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/directrix.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/impetus.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/spellcircles.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/the_work.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/interop/gravity.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/interop/interop.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/interop/pehkui.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/abacus.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/amethyst.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/decoration.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/edified.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/focus.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/hexcasting.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/jeweler_hammer.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/lens.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/phials.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/pigments.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/scroll.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/slate.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/spellbook.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/items/staff.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/experiment1.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/experiment2.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/inventory.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/terabithia1.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/terabithia2.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/terabithia3.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/terabithia4.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/lore/terabithia5.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/advanced_math.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/akashic_patterns.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/basics.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/circle.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/consts.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/entities.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/brainsweep.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/create_lava.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/flight.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/greater_sentinel.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/make_battery.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/teleport.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/weather_manip.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/zeniths.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/lists.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/logic.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/math.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/meta.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/numbers.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/patterns_as_iotas.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/readers_guide.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/readwrite.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/sets.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/basic.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/blockworks.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/colorize.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/hexcasting.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/itempicking.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/nadirs.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/sentinels.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/stackmanip.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/templates/brainsweep.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/templates/crafting_multi.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/templates/manual_pattern.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/templates/manual_pattern_nosig.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/en_us/templates/pattern.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/recipes/patchi_book.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/tags/entity_types/cannot_teleport.json create mode 100644 0.10.3/Common/src/main/resources/data/hexcasting/tags/entity_types/sticky_teleporters.json create mode 100644 0.10.3/Common/src/main/resources/data/minecraft/tags/items/cluster_max_harvestables.json create mode 100644 0.10.3/Common/src/main/resources/hexplat.accesswidener create mode 100644 0.10.3/Common/src/main/resources/hexplat.mixins.json create mode 100644 0.10.3/Common/src/main/resources/logo.png create mode 100644 0.10.3/Common/src/main/resources/pack.mcmeta create mode 100644 0.10.3/Common/src/test/java/EulerPathFinderTest.kt create mode 100644 0.10.3/Common/src/test/java/WhatRangeDoTheNoisesOutputAnywaysTest.java create mode 100644 0.10.3/Fabric/build.gradle create mode 100644 0.10.3/Fabric/gradle.properties create mode 100644 0.10.3/Fabric/src/generated/resources/data/c/tags/items/amethyst_dusts.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/c/tags/items/gems.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/create/recipes/crushing/amethyst_block.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/create/recipes/crushing/amethyst_cluster.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/akashic_record.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/budding_amethyst.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/directrix_redstone.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_look.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_rightclick.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_storedplayer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/abacus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/acacia_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/ageing_scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/akashic_bookshelf.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/akashic_connector.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/amethyst_dust_packing.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/amethyst_dust_unpacking.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/amethyst_sconce.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/amethyst_tiles.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/ancient_scroll_paper.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/artifact.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/birch_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/crimson_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/cypher.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dark_oak_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_black.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_blue.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_brown.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_cyan.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_gray.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_green.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_light_blue.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_light_gray.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_lime.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_magenta.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_orange.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_pink.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_purple.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_red.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_white.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/dye_colorizer_yellow.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_button.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_door.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_panel.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_pressure_plate.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_slab.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_stairs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_tile.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_trapdoor.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/edified_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/empty_directrix.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/empty_impetus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/focus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/jeweler_hammer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/jungle_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/lens.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/oak_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_agender.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_aroace.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_aromantic.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_asexual.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_bisexual.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_demiboy.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_demigirl.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_gay.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_genderfluid.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_genderqueer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_intersex.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_lesbian.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_nonbinary.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_pansexual.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_plural.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/pride_colorizer_transgender.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/scroll.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/scroll_medium.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/scroll_paper.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/scroll_small.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/slate.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/slate_block.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/slate_block_from_slates.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/spellbook.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/spruce_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/stonecutting/amethyst_tiles.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/stripped_edified_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/sub_sandwich.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/trinket.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/uuid_colorizer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting.creative_tab/warped_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/akashic_bookshelf.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/akashic_connector.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/akashic_record.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_dust_block.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_edified_leaves.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_sconce.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_tiles.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/ancient_scroll_paper.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/aventurine_edified_leaves.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/citrine_edified_leaves.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/directrix_redstone.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_button.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_door.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_log.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_panel.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_pressure_plate.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_slab.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_stairs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_tile.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_trapdoor.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/empty_directrix.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/empty_impetus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/impetus_look.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/impetus_rightclick.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/impetus_storedplayer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/scroll_paper.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/slate.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/slate_block.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/stripped_edified_log.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/blocks/stripped_edified_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/inject/amethyst_cluster.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/inject/scroll_loot_few.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/inject/scroll_loot_many.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/loot_tables/inject/scroll_loot_some.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/abacus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/acacia_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/ageing_scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/akashic_bookshelf.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/akashic_connector.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/amethyst_dust_packing.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/amethyst_dust_unpacking.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/amethyst_sconce.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/amethyst_tiles.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/ancient_scroll_paper.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/artifact.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/birch_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/brainsweep/akashic_record.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/brainsweep/budding_amethyst.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/brainsweep/directrix_redstone.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/brainsweep/impetus_look.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/brainsweep/impetus_rightclick.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/brainsweep/impetus_storedplayer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/compat/create/crushing/amethyst_shard.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_door.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_log.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_trapdoor.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/crimson_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/cypher.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dark_oak_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_black.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_blue.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_brown.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_cyan.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_gray.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_green.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_light_blue.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_light_gray.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_lime.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_magenta.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_orange.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_pink.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_purple.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_red.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_white.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dye_colorizer_yellow.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dynamic/seal_focus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/dynamic/seal_spellbook.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_button.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_door.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_panel.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_pressure_plate.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_slab.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_stairs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_tile.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_trapdoor.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/edified_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/empty_directrix.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/empty_impetus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/focus.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/jeweler_hammer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/jungle_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/lens.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/oak_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_agender.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_aroace.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_aromantic.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_asexual.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_bisexual.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_demiboy.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_demigirl.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_gay.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_genderfluid.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_genderqueer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_intersex.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_lesbian.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_nonbinary.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_pansexual.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_plural.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/pride_colorizer_transgender.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/scroll.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/scroll_medium.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/scroll_paper.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/scroll_paper_lantern.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/scroll_small.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/slate.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/slate_block.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/slate_block_from_slates.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/spellbook.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/spruce_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/stonecutting/amethyst_tiles.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/stripped_edified_wood.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/sub_sandwich.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/trinket.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/uuid_colorizer.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/recipes/warped_staff.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/blocks/edified_logs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/blocks/edified_planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/items/edified_logs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/items/edified_planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/items/grants_root_advancement.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/items/phial_base.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/hexcasting/tags/items/staves.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/buttons.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/crystal_sound_blocks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/doors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/leaves.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/logs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/pressure_plates.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/slabs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/trapdoors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/buttons.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/doors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/leaves.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/logs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/planks.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/slabs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/trapdoors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/wooden_buttons.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/wooden_doors.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/wooden_slabs.json create mode 100644 0.10.3/Fabric/src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCBrainswept.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCFavoredColorizer.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCFlight.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCHarness.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCPatterns.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCSentinel.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/HexCardinalComponents.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCColorizer.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCEntityIotaHolder.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCHexHolder.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCIotaHolder.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCItemIotaHolder.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCMediaHolder.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/package-info.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/ExtendedTexture.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/datagen/HexFabricConditionsBuilder.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/datagen/HexFabricDataGenerators.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/event/MouseScrollCallback.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/event/VillagerConversionCallback.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/ModMenuInterop.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiBrainsweepRecipe.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiEdifyRecipe.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiLevelupRecipe.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiPhialRecipe.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiProfessionRecipe.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiVillagerRecipe.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/HexEMIPlugin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/PatternRendererEMI.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/TheCoolerSlotWidget.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/VillagerEmiStack.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/VillagerVariant.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/gravity/GravityApiInterop.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/gravity/OpChangeGravity.kt create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/gravity/OpGetGravity.kt create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/trinkets/LensTrinketRenderer.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/trinkets/TrinketsApiInterop.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricAxeItemMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricBlockBehaviorMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricEnchantmentTableBlockMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricItemEntityMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricLivingEntityMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricMobMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricVillagerTurnIntoWitchMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/client/FabricAbstractTextureMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/client/FabricMixinGameRenderer.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/client/FabricMouseHandlerMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/client/FabricParticleEngineMixin.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/network/FabricPacketHandler.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/recipe/FabricModConditionalIngredient.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/recipe/FabricUnsealedIngredient.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/storage/FabricImpetusStorage.kt create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricClientXplatImpl.java create mode 100644 0.10.3/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java create mode 100644 0.10.3/Fabric/src/main/resources/META-INF/services/at.petrak.hexcasting.xplat.IClientXplatAbstractions create mode 100644 0.10.3/Fabric/src/main/resources/META-INF/services/at.petrak.hexcasting.xplat.IXplatAbstractions create mode 100644 0.10.3/Fabric/src/main/resources/assets/emi/models/item/tag/hexcasting/akashic_logs.json create mode 100644 0.10.3/Fabric/src/main/resources/assets/emi/models/item/tag/hexcasting/akashic_planks.json create mode 100644 0.10.3/Fabric/src/main/resources/assets/emi/models/item/tag/hexcasting/phial_base.json create mode 100644 0.10.3/Fabric/src/main/resources/assets/emi/models/item/tag/hexcasting/wands.json create mode 100644 0.10.3/Fabric/src/main/resources/assets/emi/recipe/defaults/hexcasting.json create mode 100644 0.10.3/Fabric/src/main/resources/data/trinkets/entities/hex.json create mode 100644 0.10.3/Fabric/src/main/resources/data/trinkets/tags/items/head/face.json create mode 100644 0.10.3/Fabric/src/main/resources/fabric.mod.json create mode 100644 0.10.3/Fabric/src/main/resources/fabricasting.accesswidener create mode 100644 0.10.3/Fabric/src/main/resources/fabricasting.mixins.json create mode 100644 0.10.3/Forge/build.gradle create mode 100644 0.10.3/Forge/gradle.properties create mode 100644 0.10.3/Forge/src/generated/resources/data/create/recipes/crushing/amethyst_block.json create mode 100644 0.10.3/Forge/src/generated/resources/data/create/recipes/crushing/amethyst_cluster.json create mode 100644 0.10.3/Forge/src/generated/resources/data/forge/tags/items/dusts/amethyst.json create mode 100644 0.10.3/Forge/src/generated/resources/data/forge/tags/items/gems.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/akashic_record.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/budding_amethyst.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/directrix_redstone.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_look.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_rightclick.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/brainsweep/brainsweep/impetus_storedplayer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/abacus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/acacia_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/ageing_scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/akashic_bookshelf.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/akashic_connector.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/amethyst_dust_packing.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/amethyst_dust_unpacking.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/amethyst_sconce.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/amethyst_tiles.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/ancient_scroll_paper.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/artifact.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/birch_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/crimson_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/cypher.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dark_oak_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_black.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_blue.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_brown.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_cyan.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_gray.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_green.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_light_blue.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_light_gray.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_lime.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_magenta.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_orange.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_pink.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_purple.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_red.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_white.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/dye_colorizer_yellow.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_button.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_door.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_panel.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_pressure_plate.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_slab.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_stairs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_tile.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_trapdoor.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/edified_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/empty_directrix.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/empty_impetus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/focus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/jeweler_hammer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/jungle_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/lens.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/oak_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_agender.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_aroace.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_aromantic.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_asexual.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_bisexual.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_demiboy.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_demigirl.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_gay.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_genderfluid.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_genderqueer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_intersex.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_lesbian.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_nonbinary.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_pansexual.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_plural.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/pride_colorizer_transgender.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/scroll.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/scroll_medium.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/scroll_paper.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/scroll_small.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/slate.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/slate_block.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/slate_block_from_slates.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/spellbook.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/spruce_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/stonecutting/amethyst_tiles.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/stripped_edified_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/sub_sandwich.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/trinket.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/uuid_colorizer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/advancements/recipes/hexcasting/warped_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/akashic_bookshelf.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/akashic_connector.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/akashic_record.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_dust_block.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_edified_leaves.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_sconce.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/amethyst_tiles.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/ancient_scroll_paper.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/aventurine_edified_leaves.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/citrine_edified_leaves.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/directrix_redstone.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_button.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_door.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_log.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_panel.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_pressure_plate.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_slab.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_stairs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_tile.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_trapdoor.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/edified_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/empty_directrix.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/empty_impetus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/impetus_look.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/impetus_rightclick.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/impetus_storedplayer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/scroll_paper.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/slate.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/slate_block.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/stripped_edified_log.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/blocks/stripped_edified_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/inject/amethyst_cluster.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/inject/scroll_loot_few.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/inject/scroll_loot_many.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/loot_tables/inject/scroll_loot_some.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/abacus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/acacia_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/ageing_scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/akashic_bookshelf.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/akashic_connector.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/amethyst_dust_packing.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/amethyst_dust_unpacking.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/amethyst_sconce.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/amethyst_tiles.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/ancient_scroll_paper.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/ancient_scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/artifact.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/birch_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/brainsweep/akashic_record.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/brainsweep/budding_amethyst.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/brainsweep/directrix_redstone.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/brainsweep/impetus_look.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/brainsweep/impetus_rightclick.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/brainsweep/impetus_storedplayer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/compat/create/crushing/amethyst_shard.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_door.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_log.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_trapdoor.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/compat/farmersdelight/cutting/akashic_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/crimson_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/cypher.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dark_oak_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_black.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_blue.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_brown.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_cyan.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_gray.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_green.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_light_blue.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_light_gray.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_lime.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_magenta.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_orange.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_pink.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_purple.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_red.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_white.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dye_colorizer_yellow.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dynamic/seal_focus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/dynamic/seal_spellbook.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_button.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_door.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_panel.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_pressure_plate.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_slab.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_stairs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_tile.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_trapdoor.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/edified_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/empty_directrix.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/empty_impetus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/focus.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/jeweler_hammer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/jungle_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/lens.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/oak_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_agender.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_aroace.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_aromantic.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_asexual.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_bisexual.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_demiboy.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_demigirl.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_gay.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_genderfluid.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_genderqueer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_intersex.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_lesbian.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_nonbinary.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_pansexual.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_plural.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/pride_colorizer_transgender.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/scroll.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/scroll_medium.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/scroll_paper.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/scroll_paper_lantern.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/scroll_small.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/slate.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/slate_block.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/slate_block_from_slates.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/spellbook.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/spruce_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/stonecutting/amethyst_tiles.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/stripped_edified_wood.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/sub_sandwich.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/trinket.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/uuid_colorizer.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/recipes/warped_staff.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/blocks/edified_logs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/blocks/edified_planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/items/edified_logs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/items/edified_planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/items/grants_root_advancement.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/items/phial_base.json create mode 100644 0.10.3/Forge/src/generated/resources/data/hexcasting/tags/items/staves.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/buttons.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/crystal_sound_blocks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/doors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/leaves.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/logs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/pressure_plates.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/slabs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/trapdoors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/buttons.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/doors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/leaves.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/logs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/planks.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/slabs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/trapdoors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/wooden_buttons.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/wooden_doors.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/wooden_slabs.json create mode 100644 0.10.3/Forge/src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexArgumentTypeRegistry.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/CapSyncers.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeImpetusCapability.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/HexCapabilities.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapEntityIotaHolder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemColorizer.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemHexHolder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemIotaHolder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemMediaHolder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapStaticIotaHolder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapStaticMediaHolder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/HexForgeConditionsBuilder.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/HexForgeDataGenerators.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexBlockStatesAndModels.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/BrainsweepRecipeCategory.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PatternDrawable.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeAccessorRegistry.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinBlockColors.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinCursedRecipeSerializerBase.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinItemColors.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgBrainsweepAck.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgColorizerUpdateAck.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgSentinelStatusUpdateAck.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeModConditionalIngredient.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeClientXplatImpl.java create mode 100644 0.10.3/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java create mode 100644 0.10.3/Forge/src/main/resources/META-INF/accesstransformer.cfg create mode 100644 0.10.3/Forge/src/main/resources/META-INF/mods.toml create mode 100644 0.10.3/Forge/src/main/resources/META-INF/services/at.petrak.hexcasting.xplat.IClientXplatAbstractions create mode 100644 0.10.3/Forge/src/main/resources/META-INF/services/at.petrak.hexcasting.xplat.IXplatAbstractions create mode 100644 0.10.3/Forge/src/main/resources/data/curios/tags/items/head.json create mode 100644 0.10.3/Forge/src/main/resources/hexcasting_forge.mixins.json create mode 100644 0.10.3/doc/properties.toml create mode 100644 0.10.3/gradle.properties create mode 100644 doc/src/hexdoc/utils/compat.py diff --git a/.vscode/launch.json b/.vscode/launch.json index 0be937e8..994a6e05 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,7 @@ "request": "launch", "module": "hexdoc.hexdoc", "args": [ - "doc/properties.toml", "-o", "out" + "0.10.3/doc/properties.toml", "-o", "out",// "--allow-missing" ], "console": "integratedTerminal", "justMyCode": false diff --git a/0.10.3/Common/build.gradle b/0.10.3/Common/build.gradle new file mode 100644 index 00000000..b703a769 --- /dev/null +++ b/0.10.3/Common/build.gradle @@ -0,0 +1,60 @@ +plugins { + id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' +} + +archivesBaseName = getArtifactID("common") + +minecraft { + version(minecraftVersion) + accessWideners 'src/main/resources/hexplat.accesswidener' +} + +repositories { + mavenCentral() + + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } + + maven { url 'https://maven.blamejared.com' } + + maven { + // location of the maven that hosts JEI files + name = "Progwml6 maven" + url = "https://dvs1.progwml6.com/files/maven/" + } + maven { + // location of a maven mirror for JEI files, as a fallback + name = "ModMaven" + url = "https://modmaven.dev" + } +} + +dependencies { + compileOnly group: 'org.spongepowered', name: 'mixin', version: '0.8.5' + implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' + + compileOnly "at.petra-k.paucal:paucal-common-$minecraftVersion:$paucalVersion" + compileOnly "vazkii.patchouli:Patchouli-xplat:$minecraftVersion-$patchouliVersion" + + compileOnly "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" + testCompileOnly "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" + + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.1' +} + +test { + useJUnitPlatform() +} + +processResources { + def buildProps = project.properties.clone() + + filesMatching(['pack.mcmeta']) { + expand buildProps + } +} + +setupJar(this) diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_bookshelf.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_bookshelf.json new file mode 100644 index 00000000..2f79ec12 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_bookshelf.json @@ -0,0 +1,107 @@ +{ + "variants": { + "facing=east,has_books=false": { + "model": "hexcasting:block/akashic_bookshelf_empty", + "uvlock": true, + "y": 90 + }, + "facing=east,has_books=true": [ + { + "model": "hexcasting:block/akashic_bookshelf_1", + "uvlock": true, + "y": 90 + }, + { + "model": "hexcasting:block/akashic_bookshelf_2", + "uvlock": true, + "y": 90 + }, + { + "model": "hexcasting:block/akashic_bookshelf_3", + "uvlock": true, + "y": 90 + }, + { + "model": "hexcasting:block/akashic_bookshelf_4", + "uvlock": true, + "y": 90 + } + ], + "facing=north,has_books=false": { + "model": "hexcasting:block/akashic_bookshelf_empty", + "uvlock": true + }, + "facing=north,has_books=true": [ + { + "model": "hexcasting:block/akashic_bookshelf_1", + "uvlock": true + }, + { + "model": "hexcasting:block/akashic_bookshelf_2", + "uvlock": true + }, + { + "model": "hexcasting:block/akashic_bookshelf_3", + "uvlock": true + }, + { + "model": "hexcasting:block/akashic_bookshelf_4", + "uvlock": true + } + ], + "facing=south,has_books=false": { + "model": "hexcasting:block/akashic_bookshelf_empty", + "uvlock": true, + "y": 180 + }, + "facing=south,has_books=true": [ + { + "model": "hexcasting:block/akashic_bookshelf_1", + "uvlock": true, + "y": 180 + }, + { + "model": "hexcasting:block/akashic_bookshelf_2", + "uvlock": true, + "y": 180 + }, + { + "model": "hexcasting:block/akashic_bookshelf_3", + "uvlock": true, + "y": 180 + }, + { + "model": "hexcasting:block/akashic_bookshelf_4", + "uvlock": true, + "y": 180 + } + ], + "facing=west,has_books=false": { + "model": "hexcasting:block/akashic_bookshelf_empty", + "uvlock": true, + "y": 270 + }, + "facing=west,has_books=true": [ + { + "model": "hexcasting:block/akashic_bookshelf_1", + "uvlock": true, + "y": 270 + }, + { + "model": "hexcasting:block/akashic_bookshelf_2", + "uvlock": true, + "y": 270 + }, + { + "model": "hexcasting:block/akashic_bookshelf_3", + "uvlock": true, + "y": 270 + }, + { + "model": "hexcasting:block/akashic_bookshelf_4", + "uvlock": true, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_connector.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_connector.json new file mode 100644 index 00000000..c4552b49 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_connector.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/akashic_ligature" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_record.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_record.json new file mode 100644 index 00000000..c2aa512a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/akashic_record.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/akashic_record" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_dust_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_dust_block.json new file mode 100644 index 00000000..c27c62ff --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_dust_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/amethyst_dust_block" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_edified_leaves.json new file mode 100644 index 00000000..db8af585 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_edified_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/amethyst_edified_leaves" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_sconce.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_sconce.json new file mode 100644 index 00000000..af524109 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_sconce.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/amethyst_sconce" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_tiles.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_tiles.json new file mode 100644 index 00000000..79459a90 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/amethyst_tiles.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/amethyst_tiles" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper.json new file mode 100644 index 00000000..1c809c02 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/ancient_scroll_paper" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper_lantern.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper_lantern.json new file mode 100644 index 00000000..3a632c39 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/ancient_scroll_paper_lantern.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/ancient_scroll_paper_lantern" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/aventurine_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/aventurine_edified_leaves.json new file mode 100644 index 00000000..10383418 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/aventurine_edified_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/aventurine_edified_leaves" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/citrine_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/citrine_edified_leaves.json new file mode 100644 index 00000000..3207814e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/citrine_edified_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/citrine_edified_leaves" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured.json new file mode 100644 index 00000000..5e8ffe70 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/conjured" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured_block.json new file mode 100644 index 00000000..5e8ffe70 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/conjured_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/conjured" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/directrix_redstone.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/directrix_redstone.json new file mode 100644 index 00000000..12b4b608 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/directrix_redstone.json @@ -0,0 +1,76 @@ +{ + "variants": { + "energized=false,facing=down,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_dim_down" + }, + "energized=false,facing=down,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_dim_down" + }, + "energized=false,facing=east,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_dim_east" + }, + "energized=false,facing=east,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_dim_east" + }, + "energized=false,facing=north,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_dim_north" + }, + "energized=false,facing=north,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_dim_north" + }, + "energized=false,facing=south,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_dim_south" + }, + "energized=false,facing=south,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_dim_south" + }, + "energized=false,facing=up,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_dim_up" + }, + "energized=false,facing=up,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_dim_up" + }, + "energized=false,facing=west,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_dim_west" + }, + "energized=false,facing=west,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_dim_west" + }, + "energized=true,facing=down,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_lit_down" + }, + "energized=true,facing=down,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_lit_down" + }, + "energized=true,facing=east,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_lit_east" + }, + "energized=true,facing=east,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_lit_east" + }, + "energized=true,facing=north,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_lit_north" + }, + "energized=true,facing=north,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_lit_north" + }, + "energized=true,facing=south,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_lit_south" + }, + "energized=true,facing=south,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_lit_south" + }, + "energized=true,facing=up,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_lit_up" + }, + "energized=true,facing=up,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_lit_up" + }, + "energized=true,facing=west,powered=false": { + "model": "hexcasting:block/redstone_directrix_unpowered_lit_west" + }, + "energized=true,facing=west,powered=true": { + "model": "hexcasting:block/redstone_directrix_powered_lit_west" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_button.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_button.json new file mode 100644 index 00000000..81efad6f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_button.json @@ -0,0 +1,118 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "hexcasting:block/edified_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "hexcasting:block/edified_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "hexcasting:block/edified_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "hexcasting:block/edified_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "hexcasting:block/edified_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "hexcasting:block/edified_button" + }, + "face=floor,facing=north,powered=true": { + "model": "hexcasting:block/edified_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "hexcasting:block/edified_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "hexcasting:block/edified_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "hexcasting:block/edified_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "hexcasting:block/edified_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "hexcasting:block/edified_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "hexcasting:block/edified_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "hexcasting:block/edified_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_door.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_door.json new file mode 100644 index 00000000..029d3bd5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "hexcasting:block/edified_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "hexcasting:block/edified_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "hexcasting:block/edified_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "hexcasting:block/edified_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_log.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_log.json new file mode 100644 index 00000000..4cd8fe5d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hexcasting:block/edified_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hexcasting:block/edified_log" + }, + "axis=z": { + "model": "hexcasting:block/edified_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_panel.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_panel.json new file mode 100644 index 00000000..17d99a79 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_panel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/edified_panel" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_planks.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_planks.json new file mode 100644 index 00000000..a2d790f0 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_planks.json @@ -0,0 +1,17 @@ +{ + "variants": { + "": [ + { + "model": "hexcasting:block/edified_planks", + "weight": 3 + }, + { + "model": "hexcasting:block/edified_planks_2", + "weight": 3 + }, + { + "model": "hexcasting:block/edified_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_pressure_plate.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_pressure_plate.json new file mode 100644 index 00000000..6da4bab9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "hexcasting:block/edified_pressure_plate" + }, + "powered=true": { + "model": "hexcasting:block/edified_pressure_plate_down" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_slab.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_slab.json new file mode 100644 index 00000000..6a4d4be0 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "hexcasting:block/edified_slab" + }, + "type=double": { + "model": "hexcasting:block/edified_planks" + }, + "type=top": { + "model": "hexcasting:block/edified_slab_top" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_stairs.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_stairs.json new file mode 100644 index 00000000..23ac40ca --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "hexcasting:block/edified_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "hexcasting:block/edified_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "hexcasting:block/edified_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "hexcasting:block/edified_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_tile.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_tile.json new file mode 100644 index 00000000..23d71da0 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_tile.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/edified_tile" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_trapdoor.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_trapdoor.json new file mode 100644 index 00000000..0df527ca --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "hexcasting:block/edified_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "hexcasting:block/edified_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "hexcasting:block/edified_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "hexcasting:block/edified_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "hexcasting:block/edified_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "hexcasting:block/edified_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "hexcasting:block/edified_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "hexcasting:block/edified_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "hexcasting:block/edified_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "hexcasting:block/edified_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_wood.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_wood.json new file mode 100644 index 00000000..1d963101 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/edified_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hexcasting:block/edified_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hexcasting:block/edified_wood" + }, + "axis=z": { + "model": "hexcasting:block/edified_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_directrix.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_directrix.json new file mode 100644 index 00000000..464aa5bc --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_directrix.json @@ -0,0 +1,22 @@ +{ + "variants": { + "axis=x,energized=false": { + "model": "hexcasting:block/empty_directrix_dim_x" + }, + "axis=x,energized=true": { + "model": "hexcasting:block/empty_directrix_lit_x" + }, + "axis=y,energized=false": { + "model": "hexcasting:block/empty_directrix_dim_y" + }, + "axis=y,energized=true": { + "model": "hexcasting:block/empty_directrix_lit_y" + }, + "axis=z,energized=false": { + "model": "hexcasting:block/empty_directrix_dim_z" + }, + "axis=z,energized=true": { + "model": "hexcasting:block/empty_directrix_lit_z" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_impetus.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_impetus.json new file mode 100644 index 00000000..0a87a5ff --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/empty_impetus.json @@ -0,0 +1,40 @@ +{ + "variants": { + "energized=false,facing=down": { + "model": "hexcasting:block/empty_impetus_dim_down" + }, + "energized=false,facing=east": { + "model": "hexcasting:block/empty_impetus_dim_east" + }, + "energized=false,facing=north": { + "model": "hexcasting:block/empty_impetus_dim_north" + }, + "energized=false,facing=south": { + "model": "hexcasting:block/empty_impetus_dim_south" + }, + "energized=false,facing=up": { + "model": "hexcasting:block/empty_impetus_dim_up" + }, + "energized=false,facing=west": { + "model": "hexcasting:block/empty_impetus_dim_west" + }, + "energized=true,facing=down": { + "model": "hexcasting:block/empty_impetus_lit_down" + }, + "energized=true,facing=east": { + "model": "hexcasting:block/empty_impetus_lit_east" + }, + "energized=true,facing=north": { + "model": "hexcasting:block/empty_impetus_lit_north" + }, + "energized=true,facing=south": { + "model": "hexcasting:block/empty_impetus_lit_south" + }, + "energized=true,facing=up": { + "model": "hexcasting:block/empty_impetus_lit_up" + }, + "energized=true,facing=west": { + "model": "hexcasting:block/empty_impetus_lit_west" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_look.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_look.json new file mode 100644 index 00000000..b5e851cb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_look.json @@ -0,0 +1,40 @@ +{ + "variants": { + "energized=false,facing=down": { + "model": "hexcasting:block/impetus_look_dim_down" + }, + "energized=false,facing=east": { + "model": "hexcasting:block/impetus_look_dim_east" + }, + "energized=false,facing=north": { + "model": "hexcasting:block/impetus_look_dim_north" + }, + "energized=false,facing=south": { + "model": "hexcasting:block/impetus_look_dim_south" + }, + "energized=false,facing=up": { + "model": "hexcasting:block/impetus_look_dim_up" + }, + "energized=false,facing=west": { + "model": "hexcasting:block/impetus_look_dim_west" + }, + "energized=true,facing=down": { + "model": "hexcasting:block/impetus_look_lit_down" + }, + "energized=true,facing=east": { + "model": "hexcasting:block/impetus_look_lit_east" + }, + "energized=true,facing=north": { + "model": "hexcasting:block/impetus_look_lit_north" + }, + "energized=true,facing=south": { + "model": "hexcasting:block/impetus_look_lit_south" + }, + "energized=true,facing=up": { + "model": "hexcasting:block/impetus_look_lit_up" + }, + "energized=true,facing=west": { + "model": "hexcasting:block/impetus_look_lit_west" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_rightclick.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_rightclick.json new file mode 100644 index 00000000..85f49e7c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_rightclick.json @@ -0,0 +1,40 @@ +{ + "variants": { + "energized=false,facing=down": { + "model": "hexcasting:block/impetus_rightclick_dim_down" + }, + "energized=false,facing=east": { + "model": "hexcasting:block/impetus_rightclick_dim_east" + }, + "energized=false,facing=north": { + "model": "hexcasting:block/impetus_rightclick_dim_north" + }, + "energized=false,facing=south": { + "model": "hexcasting:block/impetus_rightclick_dim_south" + }, + "energized=false,facing=up": { + "model": "hexcasting:block/impetus_rightclick_dim_up" + }, + "energized=false,facing=west": { + "model": "hexcasting:block/impetus_rightclick_dim_west" + }, + "energized=true,facing=down": { + "model": "hexcasting:block/impetus_rightclick_lit_down" + }, + "energized=true,facing=east": { + "model": "hexcasting:block/impetus_rightclick_lit_east" + }, + "energized=true,facing=north": { + "model": "hexcasting:block/impetus_rightclick_lit_north" + }, + "energized=true,facing=south": { + "model": "hexcasting:block/impetus_rightclick_lit_south" + }, + "energized=true,facing=up": { + "model": "hexcasting:block/impetus_rightclick_lit_up" + }, + "energized=true,facing=west": { + "model": "hexcasting:block/impetus_rightclick_lit_west" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_storedplayer.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_storedplayer.json new file mode 100644 index 00000000..b25cb7ed --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/impetus_storedplayer.json @@ -0,0 +1,76 @@ +{ + "variants": { + "energized=false,facing=down,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_dim_down" + }, + "energized=false,facing=down,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_dim_down" + }, + "energized=false,facing=east,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_dim_east" + }, + "energized=false,facing=east,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_dim_east" + }, + "energized=false,facing=north,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_dim_north" + }, + "energized=false,facing=north,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_dim_north" + }, + "energized=false,facing=south,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_dim_south" + }, + "energized=false,facing=south,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_dim_south" + }, + "energized=false,facing=up,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_dim_up" + }, + "energized=false,facing=up,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_dim_up" + }, + "energized=false,facing=west,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_dim_west" + }, + "energized=false,facing=west,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_dim_west" + }, + "energized=true,facing=down,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_lit_down" + }, + "energized=true,facing=down,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_lit_down" + }, + "energized=true,facing=east,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_lit_east" + }, + "energized=true,facing=east,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_lit_east" + }, + "energized=true,facing=north,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_lit_north" + }, + "energized=true,facing=north,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_lit_north" + }, + "energized=true,facing=south,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_lit_south" + }, + "energized=true,facing=south,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_lit_south" + }, + "energized=true,facing=up,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_lit_up" + }, + "energized=true,facing=up,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_lit_up" + }, + "energized=true,facing=west,powered=false": { + "model": "hexcasting:block/impetus_storedplayer_lit_west" + }, + "energized=true,facing=west,powered=true": { + "model": "hexcasting:block/impetus_storedplayer_lit_west" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper.json new file mode 100644 index 00000000..2621fa1b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/scroll_paper" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper_lantern.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper_lantern.json new file mode 100644 index 00000000..328e1b46 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/scroll_paper_lantern.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/scroll_paper_lantern" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate.json new file mode 100644 index 00000000..8d7a817c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate.json @@ -0,0 +1,122 @@ +{ + "variants": { + "energized=false,face=ceiling,facing=east": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=false,face=ceiling,facing=north": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=false,face=ceiling,facing=south": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=false,face=ceiling,facing=west": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=false,face=floor,facing=east": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=false,face=floor,facing=north": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=false,face=floor,facing=south": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=false,face=floor,facing=west": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=false,face=wall,facing=east": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90, + "y": 90 + }, + "energized=false,face=wall,facing=north": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90 + }, + "energized=false,face=wall,facing=south": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90, + "y": 180 + }, + "energized=false,face=wall,facing=west": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90, + "y": 270 + }, + "energized=true,face=ceiling,facing=east": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=true,face=ceiling,facing=north": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=true,face=ceiling,facing=south": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=true,face=ceiling,facing=west": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 180 + }, + "energized=true,face=floor,facing=east": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=true,face=floor,facing=north": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=true,face=floor,facing=south": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=true,face=floor,facing=west": { + "model": "hexcasting:block/slate", + "uvlock": true + }, + "energized=true,face=wall,facing=east": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90, + "y": 90 + }, + "energized=true,face=wall,facing=north": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90 + }, + "energized=true,face=wall,facing=south": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90, + "y": 180 + }, + "energized=true,face=wall,facing=west": { + "model": "hexcasting:block/slate", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate_block.json new file mode 100644 index 00000000..35169aaa --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/slate_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hexcasting:block/slate_block" + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_log.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_log.json new file mode 100644 index 00000000..cb09f012 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hexcasting:block/stripped_edified_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hexcasting:block/stripped_edified_log" + }, + "axis=z": { + "model": "hexcasting:block/stripped_edified_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_wood.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_wood.json new file mode 100644 index 00000000..b6b89e3f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/blockstates/stripped_edified_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hexcasting:block/stripped_edified_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hexcasting:block/stripped_edified_wood" + }, + "axis=z": { + "model": "hexcasting:block/stripped_edified_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf.json new file mode 100644 index 00000000..dfd9013c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf.json @@ -0,0 +1,68 @@ +{ + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top_bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#front" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top_bottom" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "north": { + "cullface": "north", + "texture": "#overlay", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "front": "hexcasting:block/akashic_bookshelf", + "particle": "hexcasting:block/akashic_bookshelf_vert", + "side": "hexcasting:block/akashic_bookshelf_horiz", + "top_bottom": "hexcasting:block/akashic_bookshelf_vert" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_1.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_1.json new file mode 100644 index 00000000..2402c6c5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_1.json @@ -0,0 +1,6 @@ +{ + "parent": "hexcasting:block/akashic_bookshelf", + "textures": { + "overlay": "hexcasting:block/akashic_bookshelf_overlay_1" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_2.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_2.json new file mode 100644 index 00000000..4846d3c2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_2.json @@ -0,0 +1,6 @@ +{ + "parent": "hexcasting:block/akashic_bookshelf", + "textures": { + "overlay": "hexcasting:block/akashic_bookshelf_overlay_2" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_3.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_3.json new file mode 100644 index 00000000..9352317b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_3.json @@ -0,0 +1,6 @@ +{ + "parent": "hexcasting:block/akashic_bookshelf", + "textures": { + "overlay": "hexcasting:block/akashic_bookshelf_overlay_3" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_4.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_4.json new file mode 100644 index 00000000..4f98ee65 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_4.json @@ -0,0 +1,6 @@ +{ + "parent": "hexcasting:block/akashic_bookshelf", + "textures": { + "overlay": "hexcasting:block/akashic_bookshelf_overlay_4" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_empty.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_empty.json new file mode 100644 index 00000000..9b788e5d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_bookshelf_empty.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "front": "hexcasting:block/akashic_bookshelf", + "side": "hexcasting:block/akashic_bookshelf_horiz", + "top": "hexcasting:block/akashic_bookshelf_vert" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_ligature.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_ligature.json new file mode 100644 index 00000000..72a32c3a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_ligature.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/akashic_ligature" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_record.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_record.json new file mode 100644 index 00000000..099f9920 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/akashic_record.json @@ -0,0 +1,87 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#outer" + }, + "east": { + "cullface": "east", + "texture": "#outer" + }, + "north": { + "cullface": "north", + "texture": "#outer" + }, + "south": { + "cullface": "south", + "texture": "#outer" + }, + "up": { + "cullface": "up", + "texture": "#outer" + }, + "west": { + "cullface": "west", + "texture": "#outer" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "rotation": 180, + "texture": "#inner" + }, + "east": { + "rotation": 180, + "texture": "#inner" + }, + "north": { + "rotation": 180, + "texture": "#inner" + }, + "south": { + "rotation": 180, + "texture": "#inner" + }, + "up": { + "rotation": 180, + "texture": "#inner" + }, + "west": { + "rotation": 180, + "texture": "#inner" + } + }, + "from": [ + 15.75, + 15.75, + 15.75 + ], + "to": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "inner": "hexcasting:block/akashic_ligature", + "outer": "hexcasting:block/akashic_record", + "particle": "hexcasting:block/akashic_ligature" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_dust_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_dust_block.json new file mode 100644 index 00000000..8fa450ab --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_dust_block.json @@ -0,0 +1,6 @@ +{ + "parent": "hexcasting:block/cube_half_mirrored", + "textures": { + "all": "hexcasting:block/amethyst_dust_block" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_edified_leaves.json new file mode 100644 index 00000000..1430430c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_edified_leaves.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/leaves", + "render_type": "minecraft:cutout_mipped", + "textures": { + "all": "hexcasting:block/amethyst_edified_leaves" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_tiles.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_tiles.json new file mode 100644 index 00000000..9870b725 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/amethyst_tiles.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/amethyst_tiles" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper.json new file mode 100644 index 00000000..5b5b77bb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/ancient_scroll_paper" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper_lantern.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper_lantern.json new file mode 100644 index 00000000..19fc5366 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/ancient_scroll_paper_lantern.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "hexcasting:block/ancient_scroll_paper_lantern_bottom", + "side": "hexcasting:block/ancient_scroll_paper_lantern_side", + "top": "hexcasting:block/ancient_scroll_paper_lantern_top" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/aventurine_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/aventurine_edified_leaves.json new file mode 100644 index 00000000..96c1a5ee --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/aventurine_edified_leaves.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/leaves", + "render_type": "minecraft:cutout_mipped", + "textures": { + "all": "hexcasting:block/aventurine_edified_leaves" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/citrine_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/citrine_edified_leaves.json new file mode 100644 index 00000000..37ff29d3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/citrine_edified_leaves.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/leaves", + "render_type": "minecraft:cutout_mipped", + "textures": { + "all": "hexcasting:block/citrine_edified_leaves" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/conjured.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/conjured.json new file mode 100644 index 00000000..1844be1d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/conjured.json @@ -0,0 +1,6 @@ +{ + "render_type": "minecraft:cutout", + "textures": { + "particle": "minecraft:block/amethyst_block" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button.json new file mode 100644 index 00000000..1c75ef18 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button_pressed.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button_pressed.json new file mode 100644 index 00000000..a026dba7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left.json new file mode 100644 index 00000000..13c75114 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left_open.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left_open.json new file mode 100644 index 00000000..3c6b57c8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right.json new file mode 100644 index 00000000..a1a3a08e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right_open.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right_open.json new file mode 100644 index 00000000..41c7bbc9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_bottom_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left.json new file mode 100644 index 00000000..b135ece5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left_open.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left_open.json new file mode 100644 index 00000000..7d8ba1df --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right.json new file mode 100644 index 00000000..16401105 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right_open.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right_open.json new file mode 100644 index 00000000..c60867c2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_door_top_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "hexcasting:block/edified_door_lower", + "top": "hexcasting:block/edified_door_upper" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log.json new file mode 100644 index 00000000..9ba1530b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "hexcasting:block/edified_log_top", + "side": "hexcasting:block/edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log_horizontal.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log_horizontal.json new file mode 100644 index 00000000..84e434e7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "hexcasting:block/edified_log_top", + "side": "hexcasting:block/edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_panel.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_panel.json new file mode 100644 index 00000000..3d790f2a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_panel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/edified_panel" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks.json new file mode 100644 index 00000000..a7223010 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_2.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_2.json new file mode 100644 index 00000000..d0c4c583 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/edified_planks_2" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_3.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_3.json new file mode 100644 index 00000000..bad8e6ac --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/edified_planks_3" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate.json new file mode 100644 index 00000000..5a1b2b57 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate_down.json new file mode 100644 index 00000000..eeaa3646 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab.json new file mode 100644 index 00000000..09d601ec --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "hexcasting:block/edified_planks", + "side": "hexcasting:block/edified_planks", + "top": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab_top.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab_top.json new file mode 100644 index 00000000..f4d2fcf9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "hexcasting:block/edified_planks", + "side": "hexcasting:block/edified_planks", + "top": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs.json new file mode 100644 index 00000000..6e9ae9aa --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "hexcasting:block/edified_planks", + "side": "hexcasting:block/edified_planks", + "top": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_inner.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_inner.json new file mode 100644 index 00000000..7597f2c8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "hexcasting:block/edified_planks", + "side": "hexcasting:block/edified_planks", + "top": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_outer.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_outer.json new file mode 100644 index 00000000..62d7ab50 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "hexcasting:block/edified_planks", + "side": "hexcasting:block/edified_planks", + "top": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_tile.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_tile.json new file mode 100644 index 00000000..595adf00 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_tile.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/edified_tile" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_bottom.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_bottom.json new file mode 100644 index 00000000..67b61c83 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "render_type": "minecraft:cutout", + "textures": { + "texture": "hexcasting:block/edified_trapdoor" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_open.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_open.json new file mode 100644 index 00000000..03b0a364 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "render_type": "minecraft:cutout", + "textures": { + "texture": "hexcasting:block/edified_trapdoor" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_top.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_top.json new file mode 100644 index 00000000..bb9768cc --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_trapdoor_top.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "render_type": "minecraft:cutout", + "textures": { + "texture": "hexcasting:block/edified_trapdoor" + } +} diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood.json new file mode 100644 index 00000000..22851df0 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "hexcasting:block/edified_log", + "side": "hexcasting:block/edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood_horizontal.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood_horizontal.json new file mode 100644 index 00000000..72149b4b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/edified_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "hexcasting:block/edified_log", + "side": "hexcasting:block/edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_x.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_x.json new file mode 100644 index 00000000..72a80fba --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_x.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/empty/horiz_dim", + "east": "hexcasting:block/directrix/empty/end_dim", + "north": "hexcasting:block/directrix/empty/horiz_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/empty/horiz_dim", + "up": "hexcasting:block/directrix/empty/horiz_dim", + "west": "hexcasting:block/directrix/empty/end_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_y.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_y.json new file mode 100644 index 00000000..5cacc914 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_y.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/empty/end_dim", + "east": "hexcasting:block/directrix/empty/vert_dim", + "north": "hexcasting:block/directrix/empty/vert_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/empty/vert_dim", + "up": "hexcasting:block/directrix/empty/end_dim", + "west": "hexcasting:block/directrix/empty/vert_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_z.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_z.json new file mode 100644 index 00000000..ecda201c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_dim_z.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/empty/vert_dim", + "east": "hexcasting:block/directrix/empty/horiz_dim", + "north": "hexcasting:block/directrix/empty/end_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/empty/end_dim", + "up": "hexcasting:block/directrix/empty/vert_dim", + "west": "hexcasting:block/directrix/empty/horiz_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_x.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_x.json new file mode 100644 index 00000000..84db6d31 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_x.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/empty/horiz_lit", + "east": "hexcasting:block/directrix/empty/end_lit", + "north": "hexcasting:block/directrix/empty/horiz_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/empty/horiz_lit", + "up": "hexcasting:block/directrix/empty/horiz_lit", + "west": "hexcasting:block/directrix/empty/end_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_y.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_y.json new file mode 100644 index 00000000..0b6fe067 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_y.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/empty/end_lit", + "east": "hexcasting:block/directrix/empty/vert_lit", + "north": "hexcasting:block/directrix/empty/vert_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/empty/vert_lit", + "up": "hexcasting:block/directrix/empty/end_lit", + "west": "hexcasting:block/directrix/empty/vert_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_z.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_z.json new file mode 100644 index 00000000..a22d00ee --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_directrix_lit_z.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/empty/vert_lit", + "east": "hexcasting:block/directrix/empty/horiz_lit", + "north": "hexcasting:block/directrix/empty/end_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/empty/end_lit", + "up": "hexcasting:block/directrix/empty/vert_lit", + "west": "hexcasting:block/directrix/empty/horiz_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_down.json new file mode 100644 index 00000000..a8626302 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/front_empty_dim", + "east": "hexcasting:block/impetus/down_empty_dim", + "north": "hexcasting:block/impetus/down_empty_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_empty_dim", + "up": "hexcasting:block/impetus/back_empty_dim", + "west": "hexcasting:block/impetus/down_empty_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_east.json new file mode 100644 index 00000000..1a56be1b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_empty_dim", + "east": "hexcasting:block/impetus/front_empty_dim", + "north": "hexcasting:block/impetus/left_empty_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_empty_dim", + "up": "hexcasting:block/impetus/right_empty_dim", + "west": "hexcasting:block/impetus/back_empty_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_north.json new file mode 100644 index 00000000..33aacabb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_empty_dim", + "east": "hexcasting:block/impetus/right_empty_dim", + "north": "hexcasting:block/impetus/front_empty_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_empty_dim", + "up": "hexcasting:block/impetus/up_empty_dim", + "west": "hexcasting:block/impetus/left_empty_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_south.json new file mode 100644 index 00000000..80db3dc3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_empty_dim", + "east": "hexcasting:block/impetus/left_empty_dim", + "north": "hexcasting:block/impetus/back_empty_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/front_empty_dim", + "up": "hexcasting:block/impetus/down_empty_dim", + "west": "hexcasting:block/impetus/right_empty_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_up.json new file mode 100644 index 00000000..91092aeb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_empty_dim", + "east": "hexcasting:block/impetus/up_empty_dim", + "north": "hexcasting:block/impetus/up_empty_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_empty_dim", + "up": "hexcasting:block/impetus/front_empty_dim", + "west": "hexcasting:block/impetus/up_empty_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_west.json new file mode 100644 index 00000000..25cded53 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_dim_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_empty_dim", + "east": "hexcasting:block/impetus/back_empty_dim", + "north": "hexcasting:block/impetus/right_empty_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_empty_dim", + "up": "hexcasting:block/impetus/left_empty_dim", + "west": "hexcasting:block/impetus/front_empty_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_down.json new file mode 100644 index 00000000..fee8f57f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/front_empty_lit", + "east": "hexcasting:block/impetus/down_empty_lit", + "north": "hexcasting:block/impetus/down_empty_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_empty_lit", + "up": "hexcasting:block/impetus/back_empty_lit", + "west": "hexcasting:block/impetus/down_empty_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_east.json new file mode 100644 index 00000000..cbaab365 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_empty_lit", + "east": "hexcasting:block/impetus/front_empty_lit", + "north": "hexcasting:block/impetus/left_empty_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_empty_lit", + "up": "hexcasting:block/impetus/right_empty_lit", + "west": "hexcasting:block/impetus/back_empty_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_north.json new file mode 100644 index 00000000..49b977fd --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_empty_lit", + "east": "hexcasting:block/impetus/right_empty_lit", + "north": "hexcasting:block/impetus/front_empty_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_empty_lit", + "up": "hexcasting:block/impetus/up_empty_lit", + "west": "hexcasting:block/impetus/left_empty_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_south.json new file mode 100644 index 00000000..13918845 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_empty_lit", + "east": "hexcasting:block/impetus/left_empty_lit", + "north": "hexcasting:block/impetus/back_empty_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/front_empty_lit", + "up": "hexcasting:block/impetus/down_empty_lit", + "west": "hexcasting:block/impetus/right_empty_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_up.json new file mode 100644 index 00000000..05e81505 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_empty_lit", + "east": "hexcasting:block/impetus/up_empty_lit", + "north": "hexcasting:block/impetus/up_empty_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_empty_lit", + "up": "hexcasting:block/impetus/front_empty_lit", + "west": "hexcasting:block/impetus/up_empty_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_west.json new file mode 100644 index 00000000..9efb9a4a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/empty_impetus_lit_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_empty_lit", + "east": "hexcasting:block/impetus/back_empty_lit", + "north": "hexcasting:block/impetus/right_empty_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_empty_lit", + "up": "hexcasting:block/impetus/left_empty_lit", + "west": "hexcasting:block/impetus/front_empty_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_down.json new file mode 100644 index 00000000..da96cbf3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/look_dim", + "east": "hexcasting:block/impetus/down_dim", + "north": "hexcasting:block/impetus/down_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_dim", + "up": "hexcasting:block/impetus/back_dim", + "west": "hexcasting:block/impetus/down_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_east.json new file mode 100644 index 00000000..864c91ba --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_dim", + "east": "hexcasting:block/impetus/look_dim", + "north": "hexcasting:block/impetus/left_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_dim", + "up": "hexcasting:block/impetus/right_dim", + "west": "hexcasting:block/impetus/back_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_north.json new file mode 100644 index 00000000..1c1dd3bb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_dim", + "east": "hexcasting:block/impetus/right_dim", + "north": "hexcasting:block/impetus/look_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_dim", + "up": "hexcasting:block/impetus/up_dim", + "west": "hexcasting:block/impetus/left_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_south.json new file mode 100644 index 00000000..af39b85f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_dim", + "east": "hexcasting:block/impetus/left_dim", + "north": "hexcasting:block/impetus/back_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/look_dim", + "up": "hexcasting:block/impetus/down_dim", + "west": "hexcasting:block/impetus/right_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_up.json new file mode 100644 index 00000000..48d526d9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_dim", + "east": "hexcasting:block/impetus/up_dim", + "north": "hexcasting:block/impetus/up_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_dim", + "up": "hexcasting:block/impetus/look_dim", + "west": "hexcasting:block/impetus/up_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_west.json new file mode 100644 index 00000000..9ec847d8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_dim_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_dim", + "east": "hexcasting:block/impetus/back_dim", + "north": "hexcasting:block/impetus/right_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_dim", + "up": "hexcasting:block/impetus/left_dim", + "west": "hexcasting:block/impetus/look_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_down.json new file mode 100644 index 00000000..eed81db6 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/look_lit", + "east": "hexcasting:block/impetus/down_lit", + "north": "hexcasting:block/impetus/down_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_lit", + "up": "hexcasting:block/impetus/back_lit", + "west": "hexcasting:block/impetus/down_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_east.json new file mode 100644 index 00000000..5f938472 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_lit", + "east": "hexcasting:block/impetus/look_lit", + "north": "hexcasting:block/impetus/left_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_lit", + "up": "hexcasting:block/impetus/right_lit", + "west": "hexcasting:block/impetus/back_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_north.json new file mode 100644 index 00000000..2d72c132 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_lit", + "east": "hexcasting:block/impetus/right_lit", + "north": "hexcasting:block/impetus/look_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_lit", + "up": "hexcasting:block/impetus/up_lit", + "west": "hexcasting:block/impetus/left_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_south.json new file mode 100644 index 00000000..496d4369 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_lit", + "east": "hexcasting:block/impetus/left_lit", + "north": "hexcasting:block/impetus/back_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/look_lit", + "up": "hexcasting:block/impetus/down_lit", + "west": "hexcasting:block/impetus/right_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_up.json new file mode 100644 index 00000000..664800b9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_lit", + "east": "hexcasting:block/impetus/up_lit", + "north": "hexcasting:block/impetus/up_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_lit", + "up": "hexcasting:block/impetus/look_lit", + "west": "hexcasting:block/impetus/up_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_west.json new file mode 100644 index 00000000..ae05c316 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_look_lit_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_lit", + "east": "hexcasting:block/impetus/back_lit", + "north": "hexcasting:block/impetus/right_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_lit", + "up": "hexcasting:block/impetus/left_lit", + "west": "hexcasting:block/impetus/look_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_down.json new file mode 100644 index 00000000..18b1f5ae --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/rightclick_dim", + "east": "hexcasting:block/impetus/down_dim", + "north": "hexcasting:block/impetus/down_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_dim", + "up": "hexcasting:block/impetus/back_dim", + "west": "hexcasting:block/impetus/down_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_east.json new file mode 100644 index 00000000..5cd67727 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_dim", + "east": "hexcasting:block/impetus/rightclick_dim", + "north": "hexcasting:block/impetus/left_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_dim", + "up": "hexcasting:block/impetus/right_dim", + "west": "hexcasting:block/impetus/back_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_north.json new file mode 100644 index 00000000..cdcdec9e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_dim", + "east": "hexcasting:block/impetus/right_dim", + "north": "hexcasting:block/impetus/rightclick_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_dim", + "up": "hexcasting:block/impetus/up_dim", + "west": "hexcasting:block/impetus/left_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_south.json new file mode 100644 index 00000000..0f494afd --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_dim", + "east": "hexcasting:block/impetus/left_dim", + "north": "hexcasting:block/impetus/back_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/rightclick_dim", + "up": "hexcasting:block/impetus/down_dim", + "west": "hexcasting:block/impetus/right_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_up.json new file mode 100644 index 00000000..0ab86071 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_dim", + "east": "hexcasting:block/impetus/up_dim", + "north": "hexcasting:block/impetus/up_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_dim", + "up": "hexcasting:block/impetus/rightclick_dim", + "west": "hexcasting:block/impetus/up_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_west.json new file mode 100644 index 00000000..ca7a2ccb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_dim_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_dim", + "east": "hexcasting:block/impetus/back_dim", + "north": "hexcasting:block/impetus/right_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_dim", + "up": "hexcasting:block/impetus/left_dim", + "west": "hexcasting:block/impetus/rightclick_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_down.json new file mode 100644 index 00000000..ed790e5d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/rightclick_lit", + "east": "hexcasting:block/impetus/down_lit", + "north": "hexcasting:block/impetus/down_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_lit", + "up": "hexcasting:block/impetus/back_lit", + "west": "hexcasting:block/impetus/down_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_east.json new file mode 100644 index 00000000..c9f13f4a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_lit", + "east": "hexcasting:block/impetus/rightclick_lit", + "north": "hexcasting:block/impetus/left_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_lit", + "up": "hexcasting:block/impetus/right_lit", + "west": "hexcasting:block/impetus/back_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_north.json new file mode 100644 index 00000000..6af6c77d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_lit", + "east": "hexcasting:block/impetus/right_lit", + "north": "hexcasting:block/impetus/rightclick_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_lit", + "up": "hexcasting:block/impetus/up_lit", + "west": "hexcasting:block/impetus/left_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_south.json new file mode 100644 index 00000000..fc046e86 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_lit", + "east": "hexcasting:block/impetus/left_lit", + "north": "hexcasting:block/impetus/back_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/rightclick_lit", + "up": "hexcasting:block/impetus/down_lit", + "west": "hexcasting:block/impetus/right_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_up.json new file mode 100644 index 00000000..fdb94e58 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_lit", + "east": "hexcasting:block/impetus/up_lit", + "north": "hexcasting:block/impetus/up_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_lit", + "up": "hexcasting:block/impetus/rightclick_lit", + "west": "hexcasting:block/impetus/up_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_west.json new file mode 100644 index 00000000..d8ce52ee --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_rightclick_lit_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_lit", + "east": "hexcasting:block/impetus/back_lit", + "north": "hexcasting:block/impetus/right_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_lit", + "up": "hexcasting:block/impetus/left_lit", + "west": "hexcasting:block/impetus/rightclick_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_down.json new file mode 100644 index 00000000..b1d9fedb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/storedplayer_dim", + "east": "hexcasting:block/impetus/down_dim", + "north": "hexcasting:block/impetus/down_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_dim", + "up": "hexcasting:block/impetus/back_dim", + "west": "hexcasting:block/impetus/down_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_east.json new file mode 100644 index 00000000..fce67205 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_dim", + "east": "hexcasting:block/impetus/storedplayer_dim", + "north": "hexcasting:block/impetus/left_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_dim", + "up": "hexcasting:block/impetus/right_dim", + "west": "hexcasting:block/impetus/back_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_north.json new file mode 100644 index 00000000..ad81907b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_dim", + "east": "hexcasting:block/impetus/right_dim", + "north": "hexcasting:block/impetus/storedplayer_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_dim", + "up": "hexcasting:block/impetus/up_dim", + "west": "hexcasting:block/impetus/left_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_south.json new file mode 100644 index 00000000..299bf5d6 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_dim", + "east": "hexcasting:block/impetus/left_dim", + "north": "hexcasting:block/impetus/back_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/storedplayer_dim", + "up": "hexcasting:block/impetus/down_dim", + "west": "hexcasting:block/impetus/right_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_up.json new file mode 100644 index 00000000..7731a397 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_dim", + "east": "hexcasting:block/impetus/up_dim", + "north": "hexcasting:block/impetus/up_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_dim", + "up": "hexcasting:block/impetus/storedplayer_dim", + "west": "hexcasting:block/impetus/up_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_west.json new file mode 100644 index 00000000..7c64a839 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_dim_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_dim", + "east": "hexcasting:block/impetus/back_dim", + "north": "hexcasting:block/impetus/right_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_dim", + "up": "hexcasting:block/impetus/left_dim", + "west": "hexcasting:block/impetus/storedplayer_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_down.json new file mode 100644 index 00000000..0986f415 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/storedplayer_lit", + "east": "hexcasting:block/impetus/down_lit", + "north": "hexcasting:block/impetus/down_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/down_lit", + "up": "hexcasting:block/impetus/back_lit", + "west": "hexcasting:block/impetus/down_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_east.json new file mode 100644 index 00000000..80c68ade --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/right_lit", + "east": "hexcasting:block/impetus/storedplayer_lit", + "north": "hexcasting:block/impetus/left_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/right_lit", + "up": "hexcasting:block/impetus/right_lit", + "west": "hexcasting:block/impetus/back_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_north.json new file mode 100644 index 00000000..3d82c4be --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/down_lit", + "east": "hexcasting:block/impetus/right_lit", + "north": "hexcasting:block/impetus/storedplayer_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/back_lit", + "up": "hexcasting:block/impetus/up_lit", + "west": "hexcasting:block/impetus/left_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_south.json new file mode 100644 index 00000000..2d28b4ee --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/up_lit", + "east": "hexcasting:block/impetus/left_lit", + "north": "hexcasting:block/impetus/back_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/storedplayer_lit", + "up": "hexcasting:block/impetus/down_lit", + "west": "hexcasting:block/impetus/right_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_up.json new file mode 100644 index 00000000..fd08ddaa --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/back_lit", + "east": "hexcasting:block/impetus/up_lit", + "north": "hexcasting:block/impetus/up_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/up_lit", + "up": "hexcasting:block/impetus/storedplayer_lit", + "west": "hexcasting:block/impetus/up_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_west.json new file mode 100644 index 00000000..fee87024 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/impetus_storedplayer_lit_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/impetus/left_lit", + "east": "hexcasting:block/impetus/back_lit", + "north": "hexcasting:block/impetus/right_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/impetus/left_lit", + "up": "hexcasting:block/impetus/left_lit", + "west": "hexcasting:block/impetus/storedplayer_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_down.json new file mode 100644 index 00000000..86cf0338 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/front_dim", + "east": "hexcasting:block/directrix/redstone/down_powered_dim", + "north": "hexcasting:block/directrix/redstone/down_powered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/down_powered_dim", + "up": "hexcasting:block/directrix/redstone/back_powered", + "west": "hexcasting:block/directrix/redstone/down_powered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_east.json new file mode 100644 index 00000000..b33d9f8e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/right_powered_dim", + "east": "hexcasting:block/directrix/redstone/front_dim", + "north": "hexcasting:block/directrix/redstone/left_powered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/right_powered_dim", + "up": "hexcasting:block/directrix/redstone/right_powered_dim", + "west": "hexcasting:block/directrix/redstone/back_powered" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_north.json new file mode 100644 index 00000000..414be41d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/down_powered_dim", + "east": "hexcasting:block/directrix/redstone/right_powered_dim", + "north": "hexcasting:block/directrix/redstone/front_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/back_powered", + "up": "hexcasting:block/directrix/redstone/up_powered_dim", + "west": "hexcasting:block/directrix/redstone/left_powered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_south.json new file mode 100644 index 00000000..949091e7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/up_powered_dim", + "east": "hexcasting:block/directrix/redstone/left_powered_dim", + "north": "hexcasting:block/directrix/redstone/back_powered", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/front_dim", + "up": "hexcasting:block/directrix/redstone/down_powered_dim", + "west": "hexcasting:block/directrix/redstone/right_powered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_up.json new file mode 100644 index 00000000..b1d92630 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/back_powered", + "east": "hexcasting:block/directrix/redstone/up_powered_dim", + "north": "hexcasting:block/directrix/redstone/up_powered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/up_powered_dim", + "up": "hexcasting:block/directrix/redstone/front_dim", + "west": "hexcasting:block/directrix/redstone/up_powered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_west.json new file mode 100644 index 00000000..76ad7af2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_dim_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/left_powered_dim", + "east": "hexcasting:block/directrix/redstone/back_powered", + "north": "hexcasting:block/directrix/redstone/right_powered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/left_powered_dim", + "up": "hexcasting:block/directrix/redstone/left_powered_dim", + "west": "hexcasting:block/directrix/redstone/front_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_down.json new file mode 100644 index 00000000..5b04d3fa --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/front_lit", + "east": "hexcasting:block/directrix/redstone/down_powered_lit", + "north": "hexcasting:block/directrix/redstone/down_powered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/down_powered_lit", + "up": "hexcasting:block/directrix/redstone/back_powered", + "west": "hexcasting:block/directrix/redstone/down_powered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_east.json new file mode 100644 index 00000000..8f0e3cc0 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/right_powered_lit", + "east": "hexcasting:block/directrix/redstone/front_lit", + "north": "hexcasting:block/directrix/redstone/left_powered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/right_powered_lit", + "up": "hexcasting:block/directrix/redstone/right_powered_lit", + "west": "hexcasting:block/directrix/redstone/back_powered" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_north.json new file mode 100644 index 00000000..3f33bc75 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/down_powered_lit", + "east": "hexcasting:block/directrix/redstone/right_powered_lit", + "north": "hexcasting:block/directrix/redstone/front_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/back_powered", + "up": "hexcasting:block/directrix/redstone/up_powered_lit", + "west": "hexcasting:block/directrix/redstone/left_powered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_south.json new file mode 100644 index 00000000..801dcd30 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/up_powered_lit", + "east": "hexcasting:block/directrix/redstone/left_powered_lit", + "north": "hexcasting:block/directrix/redstone/back_powered", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/front_lit", + "up": "hexcasting:block/directrix/redstone/down_powered_lit", + "west": "hexcasting:block/directrix/redstone/right_powered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_up.json new file mode 100644 index 00000000..6090255b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/back_powered", + "east": "hexcasting:block/directrix/redstone/up_powered_lit", + "north": "hexcasting:block/directrix/redstone/up_powered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/up_powered_lit", + "up": "hexcasting:block/directrix/redstone/front_lit", + "west": "hexcasting:block/directrix/redstone/up_powered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_west.json new file mode 100644 index 00000000..2638f433 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_powered_lit_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/left_powered_lit", + "east": "hexcasting:block/directrix/redstone/back_powered", + "north": "hexcasting:block/directrix/redstone/right_powered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/left_powered_lit", + "up": "hexcasting:block/directrix/redstone/left_powered_lit", + "west": "hexcasting:block/directrix/redstone/front_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_down.json new file mode 100644 index 00000000..5e814990 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/front_dim", + "east": "hexcasting:block/directrix/redstone/down_unpowered_dim", + "north": "hexcasting:block/directrix/redstone/down_unpowered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/down_unpowered_dim", + "up": "hexcasting:block/directrix/redstone/back_unpowered", + "west": "hexcasting:block/directrix/redstone/down_unpowered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_east.json new file mode 100644 index 00000000..40460f71 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/right_unpowered_dim", + "east": "hexcasting:block/directrix/redstone/front_dim", + "north": "hexcasting:block/directrix/redstone/left_unpowered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/right_unpowered_dim", + "up": "hexcasting:block/directrix/redstone/right_unpowered_dim", + "west": "hexcasting:block/directrix/redstone/back_unpowered" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_north.json new file mode 100644 index 00000000..d9a6b0a9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/down_unpowered_dim", + "east": "hexcasting:block/directrix/redstone/right_unpowered_dim", + "north": "hexcasting:block/directrix/redstone/front_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/back_unpowered", + "up": "hexcasting:block/directrix/redstone/up_unpowered_dim", + "west": "hexcasting:block/directrix/redstone/left_unpowered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_south.json new file mode 100644 index 00000000..29d140d9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/up_unpowered_dim", + "east": "hexcasting:block/directrix/redstone/left_unpowered_dim", + "north": "hexcasting:block/directrix/redstone/back_unpowered", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/front_dim", + "up": "hexcasting:block/directrix/redstone/down_unpowered_dim", + "west": "hexcasting:block/directrix/redstone/right_unpowered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_up.json new file mode 100644 index 00000000..ed9d365b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/back_unpowered", + "east": "hexcasting:block/directrix/redstone/up_unpowered_dim", + "north": "hexcasting:block/directrix/redstone/up_unpowered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/up_unpowered_dim", + "up": "hexcasting:block/directrix/redstone/front_dim", + "west": "hexcasting:block/directrix/redstone/up_unpowered_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_west.json new file mode 100644 index 00000000..a88eaf5b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_dim_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/left_unpowered_dim", + "east": "hexcasting:block/directrix/redstone/back_unpowered", + "north": "hexcasting:block/directrix/redstone/right_unpowered_dim", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/left_unpowered_dim", + "up": "hexcasting:block/directrix/redstone/left_unpowered_dim", + "west": "hexcasting:block/directrix/redstone/front_dim" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_down.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_down.json new file mode 100644 index 00000000..4bd80415 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_down.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/front_lit", + "east": "hexcasting:block/directrix/redstone/down_unpowered_lit", + "north": "hexcasting:block/directrix/redstone/down_unpowered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/down_unpowered_lit", + "up": "hexcasting:block/directrix/redstone/back_unpowered", + "west": "hexcasting:block/directrix/redstone/down_unpowered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_east.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_east.json new file mode 100644 index 00000000..6dc5b454 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/right_unpowered_lit", + "east": "hexcasting:block/directrix/redstone/front_lit", + "north": "hexcasting:block/directrix/redstone/left_unpowered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/right_unpowered_lit", + "up": "hexcasting:block/directrix/redstone/right_unpowered_lit", + "west": "hexcasting:block/directrix/redstone/back_unpowered" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_north.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_north.json new file mode 100644 index 00000000..df773c09 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/down_unpowered_lit", + "east": "hexcasting:block/directrix/redstone/right_unpowered_lit", + "north": "hexcasting:block/directrix/redstone/front_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/back_unpowered", + "up": "hexcasting:block/directrix/redstone/up_unpowered_lit", + "west": "hexcasting:block/directrix/redstone/left_unpowered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_south.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_south.json new file mode 100644 index 00000000..95b474f8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/up_unpowered_lit", + "east": "hexcasting:block/directrix/redstone/left_unpowered_lit", + "north": "hexcasting:block/directrix/redstone/back_unpowered", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/front_lit", + "up": "hexcasting:block/directrix/redstone/down_unpowered_lit", + "west": "hexcasting:block/directrix/redstone/right_unpowered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_up.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_up.json new file mode 100644 index 00000000..fa0655ca --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_up.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/back_unpowered", + "east": "hexcasting:block/directrix/redstone/up_unpowered_lit", + "north": "hexcasting:block/directrix/redstone/up_unpowered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/up_unpowered_lit", + "up": "hexcasting:block/directrix/redstone/front_lit", + "west": "hexcasting:block/directrix/redstone/up_unpowered_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_west.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_west.json new file mode 100644 index 00000000..c8f4e80c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/redstone_directrix_unpowered_lit_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hexcasting:block/directrix/redstone/left_unpowered_lit", + "east": "hexcasting:block/directrix/redstone/back_unpowered", + "north": "hexcasting:block/directrix/redstone/right_unpowered_lit", + "particle": "hexcasting:block/slate", + "south": "hexcasting:block/directrix/redstone/left_unpowered_lit", + "up": "hexcasting:block/directrix/redstone/left_unpowered_lit", + "west": "hexcasting:block/directrix/redstone/front_lit" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper.json new file mode 100644 index 00000000..621451b7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/scroll_paper" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper_lantern.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper_lantern.json new file mode 100644 index 00000000..3c16a211 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/scroll_paper_lantern.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "hexcasting:block/scroll_paper_lantern_bottom", + "side": "hexcasting:block/scroll_paper_lantern_side", + "top": "hexcasting:block/scroll_paper_lantern_top" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/slate_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/slate_block.json new file mode 100644 index 00000000..0afe24d8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/slate_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "hexcasting:block/slate" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log.json new file mode 100644 index 00000000..4aa871e9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "hexcasting:block/stripped_edified_log_top", + "side": "hexcasting:block/stripped_edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log_horizontal.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log_horizontal.json new file mode 100644 index 00000000..0925c23c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "hexcasting:block/stripped_edified_log_top", + "side": "hexcasting:block/stripped_edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood.json new file mode 100644 index 00000000..8ef17c0d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "hexcasting:block/stripped_edified_log", + "side": "hexcasting:block/stripped_edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood_horizontal.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood_horizontal.json new file mode 100644 index 00000000..57dcfcc5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/block/stripped_edified_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "hexcasting:block/stripped_edified_log", + "side": "hexcasting:block/stripped_edified_log" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/abacus.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/abacus.json new file mode 100644 index 00000000..f6947c43 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/abacus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/abacus" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/acacia_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/acacia_staff.json new file mode 100644 index 00000000..b1db1c8f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/acacia_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/acacia_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/acacia" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_bookshelf.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_bookshelf.json new file mode 100644 index 00000000..7c88c3e2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/akashic_bookshelf_empty" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_connector.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_connector.json new file mode 100644 index 00000000..de9a37be --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_connector.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/akashic_ligature" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_record.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_record.json new file mode 100644 index 00000000..1ea5e0ee --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/akashic_record.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/akashic_record" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust.json new file mode 100644 index 00000000..140659df --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/amethyst_dust" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust_block.json new file mode 100644 index 00000000..8cd53fc3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_dust_block.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/amethyst_dust_block" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_edified_leaves.json new file mode 100644 index 00000000..d6015ea1 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_edified_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/amethyst_edified_leaves" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_sconce.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_sconce.json new file mode 100644 index 00000000..bb1657f9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_sconce.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/amethyst_sconce" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_tiles.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_tiles.json new file mode 100644 index 00000000..580c37a9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/amethyst_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/amethyst_tiles" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper.json new file mode 100644 index 00000000..810d0e68 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/ancient_scroll_paper" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper_lantern.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper_lantern.json new file mode 100644 index 00000000..39cf0ac2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/ancient_scroll_paper_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/ancient_scroll_paper_lantern" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact.json new file mode 100644 index 00000000..d7e2a248 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/artifact", + "predicate": { + "hexcasting:has_patterns": -0.01 + } + }, + { + "model": "hexcasting:item/artifact_filled", + "predicate": { + "hexcasting:has_patterns": 0.99 + } + } + ], + "textures": { + "layer0": "hexcasting:item/artifact" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact_filled.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact_filled.json new file mode 100644 index 00000000..9fdab84a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/artifact_filled.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/artifact_filled" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/aventurine_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/aventurine_edified_leaves.json new file mode 100644 index 00000000..0ae33021 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/aventurine_edified_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/aventurine_edified_leaves" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/battery.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/battery.json new file mode 100644 index 00000000..b446fb0e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/battery.json @@ -0,0 +1,109 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/phial_small_0", + "predicate": { + "hexcasting:max_media": 0.0, + "hexcasting:media": 0.0 + } + }, + { + "model": "hexcasting:item/phial_small_1", + "predicate": { + "hexcasting:max_media": 0.0, + "hexcasting:media": 0.25 + } + }, + { + "model": "hexcasting:item/phial_small_2", + "predicate": { + "hexcasting:max_media": 0.0, + "hexcasting:media": 0.5 + } + }, + { + "model": "hexcasting:item/phial_small_3", + "predicate": { + "hexcasting:max_media": 0.0, + "hexcasting:media": 0.75 + } + }, + { + "model": "hexcasting:item/phial_small_4", + "predicate": { + "hexcasting:max_media": 0.0, + "hexcasting:media": 1.0 + } + }, + { + "model": "hexcasting:item/phial_medium_0", + "predicate": { + "hexcasting:max_media": 1.0, + "hexcasting:media": 0.0 + } + }, + { + "model": "hexcasting:item/phial_medium_1", + "predicate": { + "hexcasting:max_media": 1.0, + "hexcasting:media": 0.25 + } + }, + { + "model": "hexcasting:item/phial_medium_2", + "predicate": { + "hexcasting:max_media": 1.0, + "hexcasting:media": 0.5 + } + }, + { + "model": "hexcasting:item/phial_medium_3", + "predicate": { + "hexcasting:max_media": 1.0, + "hexcasting:media": 0.75 + } + }, + { + "model": "hexcasting:item/phial_medium_4", + "predicate": { + "hexcasting:max_media": 1.0, + "hexcasting:media": 1.0 + } + }, + { + "model": "hexcasting:item/phial_large_0", + "predicate": { + "hexcasting:max_media": 2.0, + "hexcasting:media": 0.0 + } + }, + { + "model": "hexcasting:item/phial_large_1", + "predicate": { + "hexcasting:max_media": 2.0, + "hexcasting:media": 0.25 + } + }, + { + "model": "hexcasting:item/phial_large_2", + "predicate": { + "hexcasting:max_media": 2.0, + "hexcasting:media": 0.5 + } + }, + { + "model": "hexcasting:item/phial_large_3", + "predicate": { + "hexcasting:max_media": 2.0, + "hexcasting:media": 0.75 + } + }, + { + "model": "hexcasting:item/phial_large_4", + "predicate": { + "hexcasting:max_media": 2.0, + "hexcasting:media": 1.0 + } + } + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/birch_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/birch_staff.json new file mode 100644 index 00000000..f3705923 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/birch_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/birch_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/birch" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/bosnia_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/bosnia_staff.json new file mode 100644 index 00000000..ef91e958 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/bosnia_staff.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "hexcasting:item/staves/bosnia" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/charged_amethyst.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/charged_amethyst.json new file mode 100644 index 00000000..2d147958 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/charged_amethyst.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/charged_amethyst" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/citrine_edified_leaves.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/citrine_edified_leaves.json new file mode 100644 index 00000000..f44ca6c9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/citrine_edified_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/citrine_edified_leaves" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured.json new file mode 100644 index 00000000..a0bab4ff --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/amethyst_shard" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured_block.json new file mode 100644 index 00000000..a0bab4ff --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/conjured_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/amethyst_shard" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/creative_unlocker.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/creative_unlocker.json new file mode 100644 index 00000000..452b44f6 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/creative_unlocker.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/creative_unlocker" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/crimson_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/crimson_staff.json new file mode 100644 index 00000000..cc4245dc --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/crimson_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/crimson_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/crimson" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher.json new file mode 100644 index 00000000..20cd65cd --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/cypher", + "predicate": { + "hexcasting:has_patterns": -0.01 + } + }, + { + "model": "hexcasting:item/cypher_filled", + "predicate": { + "hexcasting:has_patterns": 0.99 + } + } + ], + "textures": { + "layer0": "hexcasting:item/cypher" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher_filled.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher_filled.json new file mode 100644 index 00000000..9a30752c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/cypher_filled.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/cypher_filled" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dark_oak_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dark_oak_staff.json new file mode 100644 index 00000000..5d11497a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dark_oak_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/dark_oak_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/dark_oak" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/directrix_redstone.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/directrix_redstone.json new file mode 100644 index 00000000..2a2f0e74 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/directrix_redstone.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/redstone_directrix_unpowered_dim_north" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_black.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_black.json new file mode 100644 index 00000000..2f55b6c2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_black.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_black" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_blue.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_blue.json new file mode 100644 index 00000000..add421a9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_blue.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_blue" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_brown.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_brown.json new file mode 100644 index 00000000..3be301eb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_brown.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_brown" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_cyan.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_cyan.json new file mode 100644 index 00000000..c436f315 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_cyan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_cyan" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_gray.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_gray.json new file mode 100644 index 00000000..146f0141 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_gray.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_gray" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_green.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_green.json new file mode 100644 index 00000000..679f1479 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_green.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_green" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_blue.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_blue.json new file mode 100644 index 00000000..433877e8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_blue.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_light_blue" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_gray.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_gray.json new file mode 100644 index 00000000..f5625b67 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_light_gray.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_light_gray" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_lime.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_lime.json new file mode 100644 index 00000000..c1cf2295 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_lime.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_lime" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_magenta.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_magenta.json new file mode 100644 index 00000000..12dcaa82 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_magenta.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_magenta" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_orange.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_orange.json new file mode 100644 index 00000000..99679c17 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_orange.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_orange" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_pink.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_pink.json new file mode 100644 index 00000000..c138e93f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_pink.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_pink" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_purple.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_purple.json new file mode 100644 index 00000000..d31e3b60 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_purple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_purple" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_red.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_red.json new file mode 100644 index 00000000..1fb8f9dd --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_red.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_red" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_white.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_white.json new file mode 100644 index 00000000..db4d15eb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_white.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_white" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_yellow.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_yellow.json new file mode 100644 index 00000000..594bb0a0 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/dye_colorizer_yellow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/dye_yellow" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_button.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_button.json new file mode 100644 index 00000000..e18736c2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "hexcasting:block/edified_planks" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_door.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_door.json new file mode 100644 index 00000000..5d6fb8d7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/edified_door" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_log.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_log.json new file mode 100644 index 00000000..d3c7aeeb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_log.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_log" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_panel.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_panel.json new file mode 100644 index 00000000..355e2765 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_panel.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_panel" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_planks.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_planks.json new file mode 100644 index 00000000..4ed5d45a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_planks" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_pressure_plate.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_pressure_plate.json new file mode 100644 index 00000000..921f7f5b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_pressure_plate" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_slab.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_slab.json new file mode 100644 index 00000000..4772af6e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_slab" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_staff.json new file mode 100644 index 00000000..02877aa7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/edified_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/edified" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_stairs.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_stairs.json new file mode 100644 index 00000000..90eb4d51 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_stairs" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_tile.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_tile.json new file mode 100644 index 00000000..05702f6e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_tile.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_tile" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_trapdoor.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_trapdoor.json new file mode 100644 index 00000000..8c89f1e8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_trapdoor_bottom" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_wood.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_wood.json new file mode 100644 index 00000000..c9bfee3a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/edified_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/edified_wood" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_directrix.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_directrix.json new file mode 100644 index 00000000..2edd6c02 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_directrix.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/empty_directrix_dim_z" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_impetus.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_impetus.json new file mode 100644 index 00000000..fc9b5e81 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/empty_impetus.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/empty_impetus_dim_east" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus.json new file mode 100644 index 00000000..013dc98f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/focus", + "predicate": { + "hexcasting:overlay_layer": 0.0 + } + }, + { + "model": "hexcasting:item/focus_filled", + "predicate": { + "hexcasting:overlay_layer": 1.0 + } + }, + { + "model": "hexcasting:item/focus_sealed", + "predicate": { + "hexcasting:overlay_layer": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/focus_empty" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_filled.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_filled.json new file mode 100644 index 00000000..3f3fcaa4 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/focus_base", + "layer1": "hexcasting:item/focus_overlay" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_sealed.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_sealed.json new file mode 100644 index 00000000..786de1ea --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/focus_sealed.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/focus_base_sealed", + "layer1": "hexcasting:item/focus_overlay_sealed" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_look.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_look.json new file mode 100644 index 00000000..358a31b5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_look.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/impetus_look_dim_east" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_rightclick.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_rightclick.json new file mode 100644 index 00000000..85c8b6c2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_rightclick.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/impetus_rightclick_dim_east" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_storedplayer.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_storedplayer.json new file mode 100644 index 00000000..22391426 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/impetus_storedplayer.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/impetus_storedplayer_dim_east" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jeweler_hammer.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jeweler_hammer.json new file mode 100644 index 00000000..22447e1f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jeweler_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "hexcasting:item/jeweler_hammer" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jungle_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jungle_staff.json new file mode 100644 index 00000000..43a0711d --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/jungle_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/jungle_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/jungle" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lens.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lens.json new file mode 100644 index 00000000..2fdc8f9c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lens.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "display": { + "head": { + "scale": [ + 0.4, + 0.4, + 0.4 + ], + "translation": [ + -2.5, + 0, + -8 + ] + } + }, + "textures": { + "layer0": "hexcasting:item/lens" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lore_fragment.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lore_fragment.json new file mode 100644 index 00000000..2b2f9e66 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/lore_fragment.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/lore_fragment" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/oak_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/oak_staff.json new file mode 100644 index 00000000..6897ef64 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/oak_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/oak_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/oak" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/old_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/old_staff.json new file mode 100644 index 00000000..0eb89ae6 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/old_staff.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "hexcasting:item/staves/old" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/patchouli_book.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/patchouli_book.json new file mode 100644 index 00000000..a840c0e4 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/patchouli_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/patchouli_book" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_0.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_0.json new file mode 100644 index 00000000..db3db02a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_large_0" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_1.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_1.json new file mode 100644 index 00000000..bdff2d10 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_large_1" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_2.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_2.json new file mode 100644 index 00000000..9c09bea4 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_large_2" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_3.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_3.json new file mode 100644 index 00000000..085960c8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_large_3" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_4.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_4.json new file mode 100644 index 00000000..c39357f8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_large_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_large_4" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_0.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_0.json new file mode 100644 index 00000000..cb8b4c09 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_medium_0" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_1.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_1.json new file mode 100644 index 00000000..a7f30e81 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_medium_1" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_2.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_2.json new file mode 100644 index 00000000..f9f5615c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_medium_2" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_3.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_3.json new file mode 100644 index 00000000..dbfcb528 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_medium_3" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_4.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_4.json new file mode 100644 index 00000000..a7501a8e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_medium_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_medium_4" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_0.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_0.json new file mode 100644 index 00000000..fda398e2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_small_0" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_1.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_1.json new file mode 100644 index 00000000..df784108 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_small_1" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_2.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_2.json new file mode 100644 index 00000000..f868032c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_small_2" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_3.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_3.json new file mode 100644 index 00000000..ce4a7999 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_small_3" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_4.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_4.json new file mode 100644 index 00000000..bde40839 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/phial_small_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/phial/phial_small_4" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_agender.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_agender.json new file mode 100644 index 00000000..9c68ff47 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_agender.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_agender" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aroace.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aroace.json new file mode 100644 index 00000000..eb0fabc5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aroace.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_aroace" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aromantic.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aromantic.json new file mode 100644 index 00000000..7ea60f31 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_aromantic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_aromantic" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_asexual.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_asexual.json new file mode 100644 index 00000000..d40b1f2b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_asexual.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_asexual" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_bisexual.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_bisexual.json new file mode 100644 index 00000000..e1d4b2d7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_bisexual.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_bisexual" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demiboy.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demiboy.json new file mode 100644 index 00000000..cd0fe060 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demiboy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_demiboy" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demigirl.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demigirl.json new file mode 100644 index 00000000..afda4cab --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_demigirl.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_demigirl" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_gay.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_gay.json new file mode 100644 index 00000000..353816c8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_gay.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_gay" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderfluid.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderfluid.json new file mode 100644 index 00000000..fe3641c7 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderfluid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_genderfluid" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderqueer.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderqueer.json new file mode 100644 index 00000000..270eeb01 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_genderqueer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_genderqueer" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_intersex.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_intersex.json new file mode 100644 index 00000000..506facd3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_intersex.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_intersex" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_lesbian.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_lesbian.json new file mode 100644 index 00000000..61d110d4 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_lesbian.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_lesbian" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_nonbinary.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_nonbinary.json new file mode 100644 index 00000000..0212b47a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_nonbinary.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_nonbinary" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_pansexual.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_pansexual.json new file mode 100644 index 00000000..706726a3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_pansexual.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_pansexual" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_plural.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_plural.json new file mode 100644 index 00000000..e6ecd789 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_plural.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_plural" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_transgender.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_transgender.json new file mode 100644 index 00000000..2655a8e5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/pride_colorizer_transgender.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/pride_transgender" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll.json new file mode 100644 index 00000000..5453ed3e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/scroll_pristine_large", + "predicate": { + "hexcasting:ancient": 0.0 + } + }, + { + "model": "hexcasting:item/scroll_ancient_large", + "predicate": { + "hexcasting:ancient": 1.0 + } + } + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_large.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_large.json new file mode 100644 index 00000000..192b9920 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_large.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/scroll_ancient_large" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_medium.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_medium.json new file mode 100644 index 00000000..eccfe83c --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_medium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/scroll_ancient_medium" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_small.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_small.json new file mode 100644 index 00000000..5f66417b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_ancient_small.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/scroll_ancient_small" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_medium.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_medium.json new file mode 100644 index 00000000..7752e9be --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_medium.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/scroll_pristine_medium", + "predicate": { + "hexcasting:ancient": 0.0 + } + }, + { + "model": "hexcasting:item/scroll_ancient_medium", + "predicate": { + "hexcasting:ancient": 1.0 + } + } + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper.json new file mode 100644 index 00000000..ee576746 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/scroll_paper" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper_lantern.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper_lantern.json new file mode 100644 index 00000000..8fafbd4a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_paper_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/scroll_paper_lantern" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_large.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_large.json new file mode 100644 index 00000000..0042b784 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_large.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/scroll_pristine_large" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_medium.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_medium.json new file mode 100644 index 00000000..a219c785 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_medium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/scroll_pristine_medium" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_small.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_small.json new file mode 100644 index 00000000..6405ebef --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_pristine_small.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/scroll_pristine_small" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_small.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_small.json new file mode 100644 index 00000000..583fd0f3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/scroll_small.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/scroll_pristine_small", + "predicate": { + "hexcasting:ancient": 0.0 + } + }, + { + "model": "hexcasting:item/scroll_ancient_small", + "predicate": { + "hexcasting:ancient": 1.0 + } + } + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate.json new file mode 100644 index 00000000..146695e2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/slate_blank", + "predicate": { + "hexcasting:written": 0.0 + } + }, + { + "model": "hexcasting:item/slate_written", + "predicate": { + "hexcasting:written": 1.0 + } + } + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_blank.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_blank.json new file mode 100644 index 00000000..df037ffa --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_blank.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/slate_blank" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_block.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_block.json new file mode 100644 index 00000000..c40e37f1 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_block.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/slate_block" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_written.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_written.json new file mode 100644 index 00000000..a17de30b --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/slate_written.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/slate_written" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook.json new file mode 100644 index 00000000..1a9c4ba6 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/spellbook", + "predicate": { + "hexcasting:overlay_layer": 0.0 + } + }, + { + "model": "hexcasting:item/spellbook_filled", + "predicate": { + "hexcasting:overlay_layer": 1.0 + } + }, + { + "model": "hexcasting:item/spellbook_sealed", + "predicate": { + "hexcasting:overlay_layer": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/spellbook_empty" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_filled.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_filled.json new file mode 100644 index 00000000..9527a5ec --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_filled.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/spellbook_base", + "layer1": "hexcasting:item/spellbook_overlay" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_sealed.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_sealed.json new file mode 100644 index 00000000..d2df3984 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spellbook_sealed.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/spellbook_base_sealed", + "layer1": "hexcasting:item/spellbook_overlay_sealed" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spruce_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spruce_staff.json new file mode 100644 index 00000000..043989b5 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/spruce_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/spruce_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/spruce" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_log.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_log.json new file mode 100644 index 00000000..69e44843 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_log.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/stripped_edified_log" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_wood.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_wood.json new file mode 100644 index 00000000..45e5b99e --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/stripped_edified_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "hexcasting:block/stripped_edified_wood" +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/sub_sandwich.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/sub_sandwich.json new file mode 100644 index 00000000..c5dd346a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/sub_sandwich.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/sub_sandwich" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket.json new file mode 100644 index 00000000..154e5af3 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/trinket", + "predicate": { + "hexcasting:has_patterns": -0.01 + } + }, + { + "model": "hexcasting:item/trinket_filled", + "predicate": { + "hexcasting:has_patterns": 0.99 + } + } + ], + "textures": { + "layer0": "hexcasting:item/trinket" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket_filled.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket_filled.json new file mode 100644 index 00000000..84b09d42 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/trinket_filled.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/trinket_filled" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/uuid_colorizer.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/uuid_colorizer.json new file mode 100644 index 00000000..0b76dd8f --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/uuid_colorizer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/colorizer/uuid" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/warped_staff.json b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/warped_staff.json new file mode 100644 index 00000000..256f63dd --- /dev/null +++ b/0.10.3/Common/src/generated/resources/assets/hexcasting/models/item/warped_staff.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/handheld_rod", + "overrides": [ + { + "model": "hexcasting:item/warped_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/old_staff", + "predicate": { + "hexcasting:funny_level": 1.0 + } + }, + { + "model": "hexcasting:item/bosnia_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/staves/warped" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aaa_wasteful_cast.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aaa_wasteful_cast.json new file mode 100644 index 00000000..3f334657 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aaa_wasteful_cast.json @@ -0,0 +1,33 @@ +{ + "parent": "hexcasting:root", + "criteria": { + "waste_amt": { + "conditions": { + "media_wasted": { + "min": 89000 + } + }, + "trigger": "hexcasting:spend_media" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.hexcasting:wasteful_cast.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "minecraft:glistering_melon_slice" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:wasteful_cast" + } + }, + "requirements": [ + [ + "waste_amt" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aab_big_cast.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aab_big_cast.json new file mode 100644 index 00000000..8955dfac --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/aab_big_cast.json @@ -0,0 +1,33 @@ +{ + "parent": "hexcasting:root", + "criteria": { + "cast_amt": { + "conditions": { + "media_spent": { + "min": 6400000 + } + }, + "trigger": "hexcasting:spend_media" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.hexcasting:big_cast.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "hexcasting:charged_amethyst" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:big_cast" + } + }, + "requirements": [ + [ + "cast_amt" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/enlightenment.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/enlightenment.json new file mode 100644 index 00000000..4488f207 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/enlightenment.json @@ -0,0 +1,37 @@ +{ + "parent": "hexcasting:opened_eyes", + "criteria": { + "health_used": { + "conditions": { + "health_used": { + "min": 0.8 + }, + "mojang_i_am_begging_and_crying_please_add_an_entity_health_criterion": { + "max": 1.0, + "min": 2.2250738585072014E-308 + } + }, + "trigger": "hexcasting:overcast" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.hexcasting:enlightenment.desc" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "minecraft:music_disc_11" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:enlightenment" + } + }, + "requirements": [ + [ + "health_used" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore.json new file mode 100644 index 00000000..9df730eb --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore.json @@ -0,0 +1,35 @@ +{ + "criteria": { + "used_item": { + "conditions": { + "item": { + "items": [ + "hexcasting:lore_fragment" + ] + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "announce_to_chat": true, + "background": "hexcasting:textures/block/slate.png", + "description": { + "translate": "advancement.hexcasting:lore.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "hexcasting:akashic_connector" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore" + } + }, + "requirements": [ + [ + "used_item" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment1.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment1.json new file mode 100644 index 00000000..f6a26fb8 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment1.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/experiment1" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment2.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment2.json new file mode 100644 index 00000000..de4705e9 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/experiment2.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/experiment2" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/inventory.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/inventory.json new file mode 100644 index 00000000..52847918 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/inventory.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/inventory" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia1.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia1.json new file mode 100644 index 00000000..6f3cfca2 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia1.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/terabithia1" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia2.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia2.json new file mode 100644 index 00000000..0b321d75 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia2.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/terabithia2" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia3.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia3.json new file mode 100644 index 00000000..ecf9beaa --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia3.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/terabithia3" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia4.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia4.json new file mode 100644 index 00000000..0e0ddea4 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia4.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/terabithia4" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia5.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia5.json new file mode 100644 index 00000000..fbcc786a --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/lore/terabithia5.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:lore", + "criteria": { + "grant": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "text": "" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "hexcasting:lore_fragment" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:lore/terabithia5" + } + }, + "requirements": [ + [ + "grant" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/opened_eyes.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/opened_eyes.json new file mode 100644 index 00000000..fde10466 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/opened_eyes.json @@ -0,0 +1,33 @@ +{ + "parent": "hexcasting:y_u_no_cast_angy", + "criteria": { + "health_used": { + "conditions": { + "mojang_i_am_begging_and_crying_please_add_an_entity_health_criterion": { + "min": 0.0 + } + }, + "trigger": "hexcasting:overcast" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.hexcasting:opened_eyes.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "minecraft:ender_eye" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:opened_eyes" + } + }, + "requirements": [ + [ + "health_used" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/root.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/root.json new file mode 100644 index 00000000..33e7a6de --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/root.json @@ -0,0 +1,35 @@ +{ + "criteria": { + "has_charged_amethyst": { + "conditions": { + "items": [ + { + "tag": "hexcasting:grants_root_advancement" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "background": "minecraft:textures/block/calcite.png", + "description": { + "translate": "advancement.hexcasting:root.desc" + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "minecraft:budding_amethyst" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:root" + } + }, + "requirements": [ + [ + "has_charged_amethyst" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/y_u_no_cast_angy.json b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/y_u_no_cast_angy.json new file mode 100644 index 00000000..49ebde35 --- /dev/null +++ b/0.10.3/Common/src/generated/resources/data/hexcasting/advancements/y_u_no_cast_angy.json @@ -0,0 +1,28 @@ +{ + "parent": "hexcasting:root", + "criteria": { + "did_the_thing": { + "trigger": "hexcasting:fail_to_cast_great_spell" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.hexcasting:y_u_no_cast_angy.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "minecraft:blaze_powder" + }, + "show_toast": true, + "title": { + "translate": "advancement.hexcasting:y_u_no_cast_angy" + } + }, + "requirements": [ + [ + "did_the_thing" + ] + ] +} \ No newline at end of file diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/README.md b/0.10.3/Common/src/main/java/at/petrak/hexcasting/README.md new file mode 100644 index 00000000..5eb52a0c --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/README.md @@ -0,0 +1,9 @@ +Hello, intrepid Github reader! + +The "flavor text" words for things in this mod and the internal names are different. (Sorry.) + +- A "Hex" is a `Cast`, cast through a [`CastingHarness`](api/spell/casting/CastingHarness.kt) +- A "Pattern" is a [`HexPattern`](api/spell/math/HexPattern.kt) +- An "Action" is an [`Operator`](api/spell/Action.kt) +- An action that pushes a spell is a [`Spell`](api/spell/SpellAction.kt) + diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/annotations/SoftImplement.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/annotations/SoftImplement.java new file mode 100644 index 00000000..c9094918 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/annotations/SoftImplement.java @@ -0,0 +1,30 @@ +package at.petrak.hexcasting.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +// https://github.com/VazkiiMods/Botania/blob/1.18.x/Common/src/main/java/vazkii/botania/common/annotations/SoftImplement.java +// yoinky sploinky + +/** + * A purely-documentative annotation. + * This annotation is used by developers in xplat code. The annotated method is intended + * to "soft implement" a certain method in a loader specific interface that cannot be + * named in xplat code and thus cannot be checked with @Override. + * In this context, "soft implement" means to implement the method by matching the signature + * with the intended interface method. + * Examples of interfaces that we would use this for is IForgeItem or FabricItem. + *

+ * The intent is that we audit such sites every major Minecraft version or so, to ensure + * that they still properly override the intended target. + */ +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.METHOD) +public @interface SoftImplement { + /** + * What interface we're soft implementing + */ + String value(); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java new file mode 100644 index 00000000..e22627dc --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java @@ -0,0 +1,32 @@ +package at.petrak.hexcasting.api; + +import com.google.common.base.Suppliers; +import net.minecraft.resources.ResourceLocation; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.function.Supplier; + +public interface HexAPI { + String MOD_ID = "hexcasting"; + Logger LOGGER = LogManager.getLogger(MOD_ID); + + Supplier INSTANCE = Suppliers.memoize(() -> { + try { + return (HexAPI) Class.forName("at.petrak.hexcasting.common.impl.HexAPIImpl") + .getDeclaredConstructor().newInstance(); + } catch (ReflectiveOperationException e) { + LogManager.getLogger().warn("Unable to find HexAPIImpl, using a dummy"); + return new HexAPI() { + }; + } + }); + + static HexAPI instance() { + return INSTANCE.get(); + } + + static ResourceLocation modLoc(String s) { + return new ResourceLocation(MOD_ID, s); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/PatternRegistry.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/PatternRegistry.java new file mode 100644 index 00000000..7e8bae1e --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/PatternRegistry.java @@ -0,0 +1,336 @@ +package at.petrak.hexcasting.api; + +import at.petrak.hexcasting.api.spell.Action; +import at.petrak.hexcasting.api.spell.math.EulerPathFinder; +import at.petrak.hexcasting.api.spell.math.HexDir; +import at.petrak.hexcasting.api.spell.math.HexPattern; +import at.petrak.hexcasting.api.spell.mishaps.MishapInvalidPattern; +import com.mojang.datafixers.util.Pair; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; + +public class PatternRegistry { + private static final ConcurrentMap actionLookup = new ConcurrentHashMap<>(); + private static final ConcurrentMap keyLookup = new ConcurrentHashMap<>(); + private static final ConcurrentLinkedDeque specialHandlers = new ConcurrentLinkedDeque<>(); + + // Map signatures to the "preferred" direction they start in and their operator ID. + private static final ConcurrentMap regularPatternLookup = + new ConcurrentHashMap<>(); + + private static final ConcurrentMap perWorldPatternLookup = + new ConcurrentHashMap<>(); + + public static void mapPattern(HexPattern pattern, ResourceLocation id, + Action action) throws RegisterPatternException { + mapPattern(pattern, id, action, false); + } + + /** + * Associate a given angle signature with a SpellOperator. + */ + public static void mapPattern(HexPattern pattern, ResourceLocation id, Action action, + boolean isPerWorld) throws RegisterPatternException { + if (actionLookup.containsKey(id)) { + throw new RegisterPatternException("The operator with id `%s` was already registered to: %s", id, + actionLookup.get(id)); + } + + actionLookup.put(id, action); + keyLookup.put(action, id); + if (isPerWorld) { + perWorldPatternLookup.put(id, new PerWorldEntry(pattern, id)); + } else { + regularPatternLookup.put(pattern.anglesSignature(), new RegularEntry(pattern.getStartDir(), id)); + } + } + + + /** + * Add a special handler, to take an arbitrary pattern and return whatever kind of operator you like. + */ + public static void addSpecialHandler(SpecialHandlerEntry handler) { + specialHandlers.add(handler); + } + + /** + * Add a special handler, to take an arbitrary pattern and return whatever kind of operator you like. + */ + public static void addSpecialHandler(ResourceLocation id, SpecialHandler handler) { + addSpecialHandler(new SpecialHandlerEntry(id, handler)); + } + + /** + * Internal use only. + */ + public static Action matchPattern(HexPattern pat, ServerLevel overworld) throws MishapInvalidPattern { + return matchPatternAndID(pat, overworld).getFirst(); + } + + /** + * Internal use only. + */ + public static Pair matchPatternAndID(HexPattern pat, + ServerLevel overworld) throws MishapInvalidPattern { + // Pipeline: + // patterns are registered here every time the game boots + // when we try to look + for (var handler : specialHandlers) { + var op = handler.handler.handlePattern(pat); + if (op != null) { + return new Pair<>(op, handler.id); + } + } + + // Is it global? + var sig = pat.anglesSignature(); + if (regularPatternLookup.containsKey(sig)) { + var it = regularPatternLookup.get(sig); + if (!actionLookup.containsKey(it.opId)) { + throw new MishapInvalidPattern(); + } + var op = actionLookup.get(it.opId); + return new Pair<>(op, it.opId); + } + + // Look it up in the world? + var ds = overworld.getDataStorage(); + Save perWorldPatterns = + ds.computeIfAbsent(Save::load, () -> Save.create(overworld.getSeed()), TAG_SAVED_DATA); + perWorldPatterns.fillMissingEntries(overworld.getSeed()); + if (perWorldPatterns.lookup.containsKey(sig)) { + var it = perWorldPatterns.lookup.get(sig); + return new Pair<>(actionLookup.get(it.getFirst()), it.getFirst()); + } + + throw new MishapInvalidPattern(); + } + + /** + * Internal use only. + */ + @Nullable + public static Action lookupPatternByShape(HexPattern pat) { + // Pipeline: + // patterns are registered here every time the game boots + // when we try to look + for (var handler : specialHandlers) { + var op = handler.handler.handlePattern(pat); + if (op != null) { + return op; + } + } + + // Is it global? + var sig = pat.anglesSignature(); + if (regularPatternLookup.containsKey(sig)) { + var it = regularPatternLookup.get(sig); + if (!actionLookup.containsKey(it.opId)) { + return null; + } + return actionLookup.get(it.opId); + } + + // Currently, there's no way to look up the name of a Great Spell, as the client is unaware of the correct + // mapping. + // TODO: add code to match any pattern in the shape of a Great Spell to its operator. + + // var ds = overworld.getDataStorage(); + // Save perWorldPatterns = + // ds.computeIfAbsent(Save::load, () -> Save.create(overworld.getSeed()), TAG_SAVED_DATA); + // perWorldPatterns.fillMissingEntries(overworld.getSeed()); + // if (perWorldPatterns.lookup.containsKey(sig)) { + // var it = perWorldPatterns.lookup.get(sig); + // return new Pair<>(actionLookup.get(it.getFirst()), it.getFirst()); + // } + + return null; + } + + /** + * Internal use only. + *

+ * Map of signatures to (op id, canonical start dir) + */ + public static Map> getPerWorldPatterns(ServerLevel overworld) { + var ds = overworld.getDataStorage(); + Save perWorldPatterns = + ds.computeIfAbsent(Save::load, () -> Save.create(overworld.getSeed()), TAG_SAVED_DATA); + return perWorldPatterns.lookup; + } + + public static ResourceLocation lookupPattern(Action action) { + return keyLookup.get(action); + } + + /** + * Internal use only. + */ + public static PatternEntry lookupPattern(ResourceLocation opId) { + if (perWorldPatternLookup.containsKey(opId)) { + var it = perWorldPatternLookup.get(opId); + return new PatternEntry(it.prototype, actionLookup.get(it.opId), true); + } + for (var kv : regularPatternLookup.entrySet()) { + var sig = kv.getKey(); + var entry = kv.getValue(); + if (entry.opId.equals(opId)) { + var pattern = HexPattern.fromAngles(sig, entry.preferredStart); + return new PatternEntry(pattern, actionLookup.get(entry.opId), false); + } + } + + throw new IllegalArgumentException("could not find a pattern for " + opId); + } + + /** + * Internal use only. + */ + public static Set getAllPerWorldPatternNames() { + return perWorldPatternLookup.keySet(); + } + + /** + * Special handling of a pattern. Before checking any of the normal angle-signature based patterns, + * a given pattern is run by all of these special handlers patterns. If none of them return non-null, + * then its signature is checked. + *

+ * In the base mod, this is used for number patterns and Bookkeeper's Gambit. + */ + @FunctionalInterface + public interface SpecialHandler { + @Nullable Action handlePattern(HexPattern pattern); + } + + public record SpecialHandlerEntry(ResourceLocation id, SpecialHandler handler) { + } + + public static class RegisterPatternException extends Exception { + public RegisterPatternException(String msg, Object... formats) { + super(String.format(msg, formats)); + } + } + + private record RegularEntry(HexDir preferredStart, ResourceLocation opId) { + } + + private record PerWorldEntry(HexPattern prototype, ResourceLocation opId) { + } + + // Fake class we pretend to use internally + public record PatternEntry(HexPattern prototype, Action action, boolean isPerWorld) { + } + + /** + * Maps angle sigs to resource locations and their preferred start dir so we can look them up in the main registry + * Save this on the world in case the random algorithm changes. + */ + public static class Save extends SavedData { + private static final String TAG_OP_ID = "op_id"; + private static final String TAG_START_DIR = "start_dir"; + + // Maps hex signatures to (op ids, canonical start dir) + private Map> lookup; + private boolean missingEntries; + + public Save(Map> lookup, boolean missingEntries) { + this.lookup = lookup; + this.missingEntries = missingEntries; + } + + public Save(Map> lookup) { + this(lookup, missingEntries(lookup)); + } + + private static boolean missingEntries(Map> lookup) { + var allIds = lookup.values().stream().map(Pair::getFirst).collect(Collectors.toSet()); + return perWorldPatternLookup.values().stream().anyMatch(it -> allIds.contains(it.opId)); + } + + private void fillMissingEntries(long seed) { + if (missingEntries) { + var doneAny = false; + + var allIds = lookup.values().stream().map(Pair::getFirst).collect(Collectors.toSet()); + for (var entry : perWorldPatternLookup.values()) { + if (!allIds.contains(entry.opId)) { + scrungle(lookup, entry.prototype, entry.opId, seed); + doneAny = true; + } + } + + if (doneAny) { + setDirty(); + missingEntries = false; + } + } + } + + @Override + public CompoundTag save(CompoundTag tag) { + this.lookup.forEach((sig, rhs) -> { + var entry = new CompoundTag(); + entry.putString(TAG_OP_ID, rhs.getFirst().toString()); + entry.putInt(TAG_START_DIR, rhs.getSecond().ordinal()); + tag.put(sig, entry); + }); + return tag; + } + + private static Save load(CompoundTag tag) { + var map = new HashMap>(); + var allIds = new HashSet(); + for (var sig : tag.getAllKeys()) { + var entry = tag.getCompound(sig); + var opId = ResourceLocation.tryParse(entry.getString(TAG_OP_ID)); + allIds.add(opId); + var startDir = HexDir.values()[entry.getInt(TAG_START_DIR)]; + map.put(sig, new Pair<>(opId, startDir)); + } + var missingEntries = perWorldPatternLookup.values().stream().anyMatch(it -> allIds.contains(it.opId)); + + return new Save(map, missingEntries); + } + + private static void scrungle(Map> lookup, HexPattern prototype, + ResourceLocation opId, long seed) { + var scrungled = EulerPathFinder.findAltDrawing(prototype, seed, it -> { + var sig = it.anglesSignature(); + return !lookup.containsKey(sig) && + !regularPatternLookup.containsKey(sig) + && specialHandlers.stream().noneMatch(handler -> handler.handler.handlePattern(it) != null); + }); + lookup.put(scrungled.anglesSignature(), new Pair<>(opId, scrungled.getStartDir())); + } + + public static Save create(long seed) { + var map = new HashMap>(); + PatternRegistry.perWorldPatternLookup.values().forEach(it -> scrungle(map, it.prototype, it.opId, seed)); + var save = new Save(map); + save.setDirty(); + return save; + } + } + + public static final String TAG_SAVED_DATA = "hex.per-world-patterns"; + + public static String getPatternCountInfo() { + return String.format( + "Loaded %d regular patterns, " + + "%d per-world patterns, and " + + "%d special handlers.", regularPatternLookup.size(), perWorldPatternLookup.size(), + specialHandlers.size()); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADColorizer.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADColorizer.java new file mode 100644 index 00000000..cc11653b --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADColorizer.java @@ -0,0 +1,37 @@ +package at.petrak.hexcasting.api.addldata; + +import net.minecraft.util.FastColor; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +import java.util.UUID; + +public interface ADColorizer { + int color(UUID owner, float time, Vec3 position); + + static int morphBetweenColors(int[] colors, Vec3 gradientDir, float time, Vec3 position) { + float fIdx = Mth.positiveModulo(time + (float) gradientDir.dot(position), 1f) * colors.length; + + int baseIdx = Mth.floor(fIdx); + float tRaw = fIdx - baseIdx; + float t = tRaw < 0.5 ? 4 * tRaw * tRaw * tRaw : (float) (1 - Math.pow(-2 * tRaw + 2, 3) / 2); + int start = colors[baseIdx % colors.length]; + int end = colors[(baseIdx + 1) % colors.length]; + + var r1 = FastColor.ARGB32.red(start); + var g1 = FastColor.ARGB32.green(start); + var b1 = FastColor.ARGB32.blue(start); + var a1 = FastColor.ARGB32.alpha(start); + var r2 = FastColor.ARGB32.red(end); + var g2 = FastColor.ARGB32.green(end); + var b2 = FastColor.ARGB32.blue(end); + var a2 = FastColor.ARGB32.alpha(end); + + var r = Mth.lerp(t, r1, r2); + var g = Mth.lerp(t, g1, g2); + var b = Mth.lerp(t, b1, b2); + var a = Mth.lerp(t, a1, a2); + + return FastColor.ARGB32.color((int) a, (int) r, (int) g, (int) b); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADHexHolder.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADHexHolder.java new file mode 100644 index 00000000..d0da5b78 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADHexHolder.java @@ -0,0 +1,21 @@ +package at.petrak.hexcasting.api.addldata; + +import at.petrak.hexcasting.api.spell.iota.Iota; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface ADHexHolder { + + boolean canDrawMediaFromInventory(); + + boolean hasHex(); + + @Nullable + List getHex(ServerLevel level); + + void writeHex(List patterns, int media); + + void clearHex(); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java new file mode 100644 index 00000000..812f4574 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java @@ -0,0 +1,32 @@ +package at.petrak.hexcasting.api.addldata; + +import at.petrak.hexcasting.api.spell.iota.Iota; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.Nullable; + +public interface ADIotaHolder { + @Nullable + CompoundTag readIotaTag(); + + @Nullable + default Iota readIota(ServerLevel world) { + var tag = readIotaTag(); + if (tag != null) { + return HexIotaTypes.deserialize(tag, world); + } else { + return null; + } + } + + @Nullable + default Iota emptyIota() { + return null; + } + + /** + * @return if the writing succeeded/would succeed + */ + boolean writeIota(@Nullable Iota iota, boolean simulate); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADMediaHolder.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADMediaHolder.java new file mode 100644 index 00000000..403a0227 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADMediaHolder.java @@ -0,0 +1,108 @@ +package at.petrak.hexcasting.api.addldata; + +import org.jetbrains.annotations.ApiStatus; + +public interface ADMediaHolder { + + /** + * Use {@code withdrawMedia(-1, true)} + * + * @see ADMediaHolder#withdrawMedia(int, boolean) + */ + @ApiStatus.OverrideOnly + int getMedia(); + + /** + * Use {@code withdrawMedia(-1, true) + insertMedia(-1, true)} where possible + * + * @see ADMediaHolder#insertMedia(int, boolean) + * @see ADMediaHolder#withdrawMedia(int, boolean) + */ + @ApiStatus.OverrideOnly + int getMaxMedia(); + + /** + * Use {@code insertMedia(media - withdrawMedia(-1, true), false)} where possible + * + * @see ADMediaHolder#insertMedia(int, boolean) + * @see ADMediaHolder#withdrawMedia(int, boolean) + */ + @ApiStatus.OverrideOnly + void setMedia(int media); + + /** + * Whether this media holder can have media inserted into it. + */ + boolean canRecharge(); + + /** + * Whether this media holder can be extracted from. + */ + boolean canProvide(); + + /** + * The priority for this media holder to be selected when casting a hex. Higher priorities are taken first. + * + * By default, + * * Charged Amethyst has priority 1000 + * * Amethyst Shards have priority 2000 + * * Amethyst Dust has priority 3000 + * * Items which hold media have priority 4000 + */ + int getConsumptionPriority(); + + /** + * Whether the media inside this media holder may be used to construct a battery. + */ + boolean canConstructBattery(); + + /** + * Withdraws media from the holder. Returns the amount of media extracted, which may be less or more than the cost. + * + * Even if {@link ADMediaHolder#canProvide} is false, you can still withdraw media this way. + * + * Withdrawing a negative amount will act as though you attempted to withdraw as much media as the holder contains. + */ + default int withdrawMedia(int cost, boolean simulate) { + var mediaHere = getMedia(); + if (cost < 0) { + cost = mediaHere; + } + if (!simulate) { + var mediaLeft = mediaHere - cost; + setMedia(mediaLeft); + } + return Math.min(cost, mediaHere); + } + + /** + * Inserts media into the holder. Returns the amount of media inserted, which may be less than the requested amount. + * + * Even if {@link ADMediaHolder#canRecharge} is false, you can still insert media this way. + * + * Inserting a negative amount will act as though you attempted to insert exactly as much media as the holder was missing. + */ + default int insertMedia(int amount, boolean simulate) { + var mediaHere = getMedia(); + int emptySpace = getMaxMedia() - mediaHere; + if (emptySpace <= 0) { + return 0; + } + if (amount < 0) { + amount = emptySpace; + } + + int inserting = Math.min(amount, emptySpace); + + if (!simulate) { + var newMedia = mediaHere + inserting; + setMedia(newMedia); + } + return inserting; + } + + int CHARGED_AMETHYST_PRIORITY = 1000; + int AMETHYST_SHARD_PRIORITY = 2000; + int AMETHYST_DUST_PRIORITY = 3000; + int BATTERY_PRIORITY = 4000; +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java new file mode 100644 index 00000000..d123f0de --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java @@ -0,0 +1,83 @@ +package at.petrak.hexcasting.api.addldata; + +import at.petrak.hexcasting.api.spell.iota.Iota; +import at.petrak.hexcasting.common.entities.EntityWallScroll; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public abstract class ItemDelegatingEntityIotaHolder implements ADIotaHolder { + private final Supplier stackSupplier; + + private final Consumer save; + + public ItemDelegatingEntityIotaHolder(Supplier stackSupplier, Consumer save) { + this.stackSupplier = stackSupplier; + this.save = save; + } + + @Override + public @Nullable CompoundTag readIotaTag() { + var delegate = IXplatAbstractions.INSTANCE.findDataHolder(this.stackSupplier.get()); + return delegate == null ? null : delegate.readIotaTag(); + } + + @Override + public boolean writeIota(@Nullable Iota datum, boolean simulate) { + var stacc = this.stackSupplier.get(); + var delegate = IXplatAbstractions.INSTANCE.findDataHolder(stacc); + var success = delegate != null && delegate.writeIota(datum, simulate); + if (success && !simulate) { + this.save.accept(stacc); + } + return success; + } + + @Override + public @Nullable Iota readIota(ServerLevel world) { + var delegate = IXplatAbstractions.INSTANCE.findDataHolder(this.stackSupplier.get()); + return delegate == null ? null : delegate.readIota(world); + } + + @Override + public @Nullable Iota emptyIota() { + var delegate = IXplatAbstractions.INSTANCE.findDataHolder(this.stackSupplier.get()); + return delegate == null ? null : delegate.emptyIota(); + } + + public static class ToItemEntity extends ItemDelegatingEntityIotaHolder { + public ToItemEntity(ItemEntity entity) { + super(entity::getItem, stack -> { + // https://github.com/VazkiiMods/Botania/blob/e6d095ff5010074b45408d6cce8ee1e328af3383/Xplat/src/main/java/vazkii/botania/common/helper/EntityHelper.java#L16 + entity.setItem(ItemStack.EMPTY); + entity.setItem(stack); + entity.setUnlimitedLifetime(); + }); + } + } + + public static class ToItemFrame extends ItemDelegatingEntityIotaHolder { + public ToItemFrame(ItemFrame entity) { + super(entity::getItem, entity::setItem); + } + } + + public static class ToWallScroll extends ItemDelegatingEntityIotaHolder { + public ToWallScroll(EntityWallScroll entity) { + super(() -> entity.scroll.copy(), stack -> { + }); + } + + @Override + public boolean writeIota(@Nullable Iota datum, boolean simulate) { + return false; + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/package-info.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/package-info.java new file mode 100644 index 00000000..a11787c8 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/addldata/package-info.java @@ -0,0 +1,10 @@ +/** + * An "Additional Data," or AD, is what I am calling the abstraction over capabilities on Forge and + * cardinal components on Fabric. + *

+ * An {@code ADFooBar} in this package will be implemented by a {@code CCFooBar} on Fabric. + * On Forge, there are a set of private records that implement them. + *

+ * The point is, this provides an interface for interacting with however whatever platform sticks extra info on stuff. + */ +package at.petrak.hexcasting.api.addldata; diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java new file mode 100644 index 00000000..66179154 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java @@ -0,0 +1,40 @@ +package at.petrak.hexcasting.api.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +public class FailToCastGreatSpellTrigger extends SimpleCriterionTrigger { + private static final ResourceLocation ID = new ResourceLocation("hexcasting", "fail_to_cast_great_spell"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public Instance createInstance(JsonObject json, EntityPredicate.Composite predicate, + DeserializationContext pContext) { + return new Instance(predicate); + } + + public void trigger(ServerPlayer player) { + super.trigger(player, e -> true); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + public Instance(EntityPredicate.Composite pPlayer) { + super(ID, pPlayer); + } + + @Override + public ResourceLocation getCriterion() { + return ID; + } + + public JsonObject serializeToJson(SerializationContext pConditions) { + return new JsonObject(); + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java new file mode 100644 index 00000000..16af02ab --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java @@ -0,0 +1,15 @@ +package at.petrak.hexcasting.api.advancements; + +import at.petrak.hexcasting.mixin.accessor.CriteriaTriggersAccessor; + +public class HexAdvancementTriggers { + public static final OvercastTrigger OVERCAST_TRIGGER = new OvercastTrigger(); + public static final SpendMediaTrigger SPEND_MEDIA_TRIGGER = new SpendMediaTrigger(); + public static final FailToCastGreatSpellTrigger FAIL_GREAT_SPELL_TRIGGER = new FailToCastGreatSpellTrigger(); + + public static void registerTriggers() { + CriteriaTriggersAccessor.hex$register(OVERCAST_TRIGGER); + CriteriaTriggersAccessor.hex$register(SPEND_MEDIA_TRIGGER); + CriteriaTriggersAccessor.hex$register(FAIL_GREAT_SPELL_TRIGGER); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java new file mode 100644 index 00000000..ae972d1c --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java @@ -0,0 +1,86 @@ +package at.petrak.hexcasting.api.advancements; + +import at.petrak.hexcasting.api.mod.HexConfig; +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +// https://github.com/TelepathicGrunt/Bumblezone/blob/latest-released/src/main/java/com/telepathicgrunt/the_bumblezone/advancements/CleanupStickyHoneyResidueTrigger.java +// https://github.com/VazkiiMods/Botania/blob/b8706e2e0bba20f67f1e103559a4ce39d63d48f9/src/main/java/vazkii/botania/common/advancements/CorporeaRequestTrigger.java + +public class OvercastTrigger extends SimpleCriterionTrigger { + private static final ResourceLocation ID = new ResourceLocation("hexcasting", "overcast"); + + private static final String TAG_MEDIA_GENERATED = "media_generated"; + private static final String TAG_HEALTH_USED = "health_used"; + // HEY KIDS DID YOYU KNOW THERE'S NOT A CRITERIA FOR HOW MUCH ***HEALTH*** AN ENTITY HAS + private static final String TAG_HEALTH_LEFT = + "mojang_i_am_begging_and_crying_please_add_an_entity_health_criterion"; + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite predicate, + DeserializationContext pContext) { + return new Instance(predicate, + MinMaxBounds.Ints.fromJson(json.get(TAG_MEDIA_GENERATED)), + MinMaxBounds.Doubles.fromJson(json.get(TAG_HEALTH_USED)), + MinMaxBounds.Doubles.fromJson(json.get(TAG_HEALTH_LEFT))); + } + + public void trigger(ServerPlayer player, int mediaGenerated) { + super.trigger(player, inst -> { + var mediaToHealth = HexConfig.common().mediaToHealthRate(); + var healthUsed = mediaGenerated / mediaToHealth; + return inst.test(mediaGenerated, healthUsed / player.getMaxHealth(), player.getHealth()); + }); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + protected final MinMaxBounds.Ints mediaGenerated; + // This is the *proporttion* of the health bar. + protected final MinMaxBounds.Doubles healthUsed; + // DID YOU KNOW THERES ONE TO CHECK THE WORLD TIME, BUT NOT THE HEALTH!? + protected final MinMaxBounds.Doubles healthLeft; + + public Instance(EntityPredicate.Composite predicate, MinMaxBounds.Ints mediaGenerated, + MinMaxBounds.Doubles healthUsed, MinMaxBounds.Doubles healthLeft) { + super(OvercastTrigger.ID, predicate); + this.mediaGenerated = mediaGenerated; + this.healthUsed = healthUsed; + // DID YOU KNOW THERE'S ONE TO CHECK THE FUCKING C A T T Y P E BUT NOT THE HEALTH + this.healthLeft = healthLeft; + } + + @Override + public ResourceLocation getCriterion() { + return ID; + } + + @Override + public JsonObject serializeToJson(SerializationContext ctx) { + JsonObject json = super.serializeToJson(ctx); + if (!this.mediaGenerated.isAny()) { + json.add(TAG_MEDIA_GENERATED, this.mediaGenerated.serializeToJson()); + } + if (!this.healthUsed.isAny()) { + json.add(TAG_HEALTH_USED, this.healthUsed.serializeToJson()); + } + if (!this.healthLeft.isAny()) { + json.add(TAG_HEALTH_LEFT, this.healthLeft.serializeToJson()); + } + return json; + } + + private boolean test(int mediaGeneratedIn, double healthUsedIn, float healthLeftIn) { + return this.mediaGenerated.matches(mediaGeneratedIn) + && this.healthUsed.matches(healthUsedIn) + // DID YOU KNOW ALL THE ENEITYT PREDICATES ARE HARD-CODED AND YOU CANT MAKE NEW ONES + && this.healthLeft.matches(healthLeftIn); + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java new file mode 100644 index 00000000..3679711d --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java @@ -0,0 +1,63 @@ +package at.petrak.hexcasting.api.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +public class SpendMediaTrigger extends SimpleCriterionTrigger { + private static final ResourceLocation ID = new ResourceLocation("hexcasting", "spend_media"); + + private static final String TAG_MEDIA_SPENT = "media_spent"; + private static final String TAG_MEDIA_WASTED = "media_wasted"; + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite predicate, + DeserializationContext pContext) { + return new Instance(predicate, + MinMaxBounds.Ints.fromJson(json.get(TAG_MEDIA_SPENT)), + MinMaxBounds.Ints.fromJson(json.get(TAG_MEDIA_WASTED))); + } + + public void trigger(ServerPlayer player, int mediaSpent, int mediaWasted) { + super.trigger(player, inst -> inst.test(mediaSpent, mediaWasted)); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + protected final MinMaxBounds.Ints mediaSpent; + protected final MinMaxBounds.Ints mediaWasted; + + public Instance(EntityPredicate.Composite predicate, MinMaxBounds.Ints mediaSpent, + MinMaxBounds.Ints mediaWasted) { + super(SpendMediaTrigger.ID, predicate); + this.mediaSpent = mediaSpent; + this.mediaWasted = mediaWasted; + } + + @Override + public ResourceLocation getCriterion() { + return ID; + } + + @Override + public JsonObject serializeToJson(SerializationContext ctx) { + JsonObject json = super.serializeToJson(ctx); + if (!this.mediaSpent.isAny()) { + json.add(TAG_MEDIA_SPENT, this.mediaSpent.serializeToJson()); + } + if (!this.mediaWasted.isAny()) { + json.add(TAG_MEDIA_WASTED, this.mediaWasted.serializeToJson()); + } + return json; + } + + private boolean test(int mediaSpentIn, int mediaWastedIn) { + return this.mediaSpent.matches(mediaSpentIn) && this.mediaWasted.matches(mediaWastedIn); + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java new file mode 100644 index 00000000..e531ddb1 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java @@ -0,0 +1,49 @@ +package at.petrak.hexcasting.api.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class HexBlockEntity extends BlockEntity { + public HexBlockEntity(BlockEntityType pType, BlockPos pWorldPosition, BlockState pBlockState) { + super(pType, pWorldPosition, pBlockState); + } + + protected abstract void saveModData(CompoundTag tag); + + protected abstract void loadModData(CompoundTag tag); + + @Override + protected void saveAdditional(CompoundTag pTag) { + this.saveModData(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + this.loadModData(pTag); + } + + @Override + public CompoundTag getUpdateTag() { + CompoundTag tag = new CompoundTag(); + this.saveModData(tag); + return tag; + } + + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + public void sync() { + this.setChanged(); + this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + } + +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockAbstractImpetus.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockAbstractImpetus.java new file mode 100644 index 00000000..958e99f7 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockAbstractImpetus.java @@ -0,0 +1,94 @@ +package at.petrak.hexcasting.api.block.circle; + +import at.petrak.hexcasting.api.spell.math.HexPattern; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import org.jetbrains.annotations.Nullable; + +import java.util.EnumSet; + +// Facing dir is the direction it starts searching for slates in to start +public abstract class BlockAbstractImpetus extends BlockCircleComponent implements EntityBlock { + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + public BlockAbstractImpetus(Properties p_49795_) { + super(p_49795_); + this.registerDefaultState( + this.stateDefinition.any().setValue(ENERGIZED, false).setValue(FACING, Direction.NORTH)); + } + + @Override + public boolean canEnterFromDirection(Direction enterDir, Direction normalDir, BlockPos pos, BlockState bs, + Level world) { + return enterDir != bs.getValue(FACING); + } + + @Override + public EnumSet exitDirections(BlockPos pos, BlockState bs, Level world) { + return EnumSet.of(bs.getValue(FACING)); + } + + @Override + public @Nullable HexPattern getPattern(BlockPos pos, BlockState bs, Level world) { + return null; + } + + @Override + public Direction normalDir(BlockPos pos, BlockState bs, Level world, int recursionLeft) { + return normalDirOfOther(pos.relative(bs.getValue(FACING)), world, recursionLeft); + } + + @Override + public float particleHeight(BlockPos pos, BlockState bs, Level world) { + return 0.5f; + } + + @Override + public void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, RandomSource pRandom) { + if (pLevel.getBlockEntity(pPos) instanceof BlockEntityAbstractImpetus tile && pState.getValue(ENERGIZED)) { + tile.stepCircle(); + } + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pNewState.is(pState.getBlock()) + && pLevel.getBlockEntity(pPos) instanceof BlockEntityAbstractImpetus impetus) { + impetus.stopCasting(); + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + return this.defaultBlockState().setValue(FACING, pContext.getNearestLookingDirection()); + } + + @Override + public BlockState rotate(BlockState pState, Rotation pRot) { + return pState.setValue(FACING, pRot.rotate(pState.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState pState, Mirror pMirror) { + return pState.rotate(pMirror.getRotation(pState.getValue(FACING))); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java new file mode 100644 index 00000000..9aead246 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java @@ -0,0 +1,77 @@ +package at.petrak.hexcasting.api.block.circle; + +import at.petrak.hexcasting.api.spell.math.HexPattern; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import org.jetbrains.annotations.Nullable; + +import java.util.EnumSet; + +public abstract class BlockCircleComponent extends Block { + public static final BooleanProperty ENERGIZED = BooleanProperty.create("energized"); + + public BlockCircleComponent(Properties p_49795_) { + super(p_49795_); + } + + /** + * Can this component get transferred to from a block coming in from that direction, with the given normal? + */ + abstract public boolean canEnterFromDirection(Direction enterDir, Direction normalDir, BlockPos pos, + BlockState bs, Level world); + + abstract public EnumSet exitDirections(BlockPos pos, BlockState bs, Level world); + + @Nullable + abstract public HexPattern getPattern(BlockPos pos, BlockState bs, Level world); + + /** + * Which direction points "up" or "out" for this block? + * This is used for {@link BlockCircleComponent#canEnterFromDirection(Direction, Direction, BlockPos, BlockState, Level)} + * as well as particles. + */ + public Direction normalDir(BlockPos pos, BlockState bs, Level world) { + return normalDir(pos, bs, world, 16); + } + + abstract public Direction normalDir(BlockPos pos, BlockState bs, Level world, int recursionLeft); + + public static Direction normalDirOfOther(BlockPos other, Level world, int recursionLeft) { + if (recursionLeft <= 0) { + return Direction.UP; + } + + var stateThere = world.getBlockState(other); + if (stateThere.getBlock() instanceof BlockCircleComponent bcc) { + return bcc.normalDir(other, stateThere, world, recursionLeft - 1); + } else { + return Direction.UP; + } + } + + /** + * How many blocks in the {@link BlockCircleComponent#normalDir(BlockPos, BlockState, Level)} from the center + * particles should be spawned in + */ + abstract public float particleHeight(BlockPos pos, BlockState bs, Level world); + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(ENERGIZED); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState pState) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { + return pState.getValue(ENERGIZED) ? 15 : 0; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java new file mode 100644 index 00000000..58c64637 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java @@ -0,0 +1,578 @@ +package at.petrak.hexcasting.api.block.circle; + +import at.petrak.hexcasting.api.block.HexBlockEntity; +import at.petrak.hexcasting.api.misc.FrozenColorizer; +import at.petrak.hexcasting.api.misc.MediaConstants; +import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.api.spell.ParticleSpray; +import at.petrak.hexcasting.api.spell.casting.CastingContext; +import at.petrak.hexcasting.api.spell.casting.CastingHarness; +import at.petrak.hexcasting.api.spell.casting.SpellCircleContext; +import at.petrak.hexcasting.api.spell.iota.PatternIota; +import at.petrak.hexcasting.api.utils.MediaHelper; +import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.common.lib.HexSounds; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; + +import java.text.DecimalFormat; +import java.util.*; + +public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implements WorldlyContainer { + public static final String + TAG_ACTIVATOR = "activator", + TAG_COLORIZER = "colorizer", + TAG_NEXT_BLOCK = "next_block", + TAG_TRACKED_BLOCKS = "tracked_blocks", + TAG_FOUND_ALL = "found_all", + TAG_MEDIA = "media", + TAG_LAST_MISHAP = "last_mishap"; + + private static final DecimalFormat DUST_AMOUNT = new DecimalFormat("###,###.##"); + + @Nullable + private UUID activator = null; + @Nullable + private FrozenColorizer colorizer = null; + @Nullable + private BlockPos nextBlock = null; + @Nullable + private List trackedBlocks = null; + private transient Set knownBlocks = null; + private boolean foundAll = false; + @Nullable + private Component lastMishap = null; + + private static final int MAX_CAPACITY = 2_000_000_000; + + private int media = 0; + + public BlockEntityAbstractImpetus(BlockEntityType pType, BlockPos pWorldPosition, BlockState pBlockState) { + super(pType, pWorldPosition, pBlockState); + } + + abstract public boolean activatorAlwaysInRange(); + + public int getMedia() { + return this.media; + } + + public void setMedia(int media) { + this.media = media; + } + + @Nullable + public Component getLastMishap() { + return lastMishap; + } + + public void setLastMishap(@Nullable Component lastMishap) { + this.lastMishap = lastMishap; + } + + public void activateSpellCircle(ServerPlayer activator) { + if (this.nextBlock != null) { + return; + } + this.level.scheduleTick(this.getBlockPos(), this.getBlockState().getBlock(), this.getTickSpeed()); + + this.activator = activator.getUUID(); + this.nextBlock = this.getBlockPos(); + this.trackedBlocks = new ArrayList<>(); + this.knownBlocks = new HashSet<>(); + this.colorizer = IXplatAbstractions.INSTANCE.getColorizer(activator); + + this.level.setBlockAndUpdate(this.getBlockPos(), + this.getBlockState().setValue(BlockAbstractImpetus.ENERGIZED, true)); + this.stepCircle(); + } + + public void applyScryingLensOverlay(List> lines, + BlockState state, BlockPos pos, + Player observer, Level world, + Direction hitFace) { + if (world.getBlockEntity(pos) instanceof BlockEntityAbstractImpetus beai) { + if (beai.getMedia() < 0) { + lines.add(new Pair<>(new ItemStack(HexItems.AMETHYST_DUST), ItemCreativeUnlocker.infiniteMedia(world))); + } else { + var dustCount = (float) beai.getMedia() / (float) MediaConstants.DUST_UNIT; + var dustCmp = Component.translatable("hexcasting.tooltip.media", + DUST_AMOUNT.format(dustCount)); + lines.add(new Pair<>(new ItemStack(HexItems.AMETHYST_DUST), dustCmp)); + } + + var mishap = this.getLastMishap(); + if (mishap != null) { + lines.add(new Pair<>(new ItemStack(Items.MUSIC_DISC_11), mishap)); + } + } + } + + @Override + protected void saveModData(CompoundTag tag) { + if (this.activator != null && this.colorizer != null && this.nextBlock != null && this.trackedBlocks != null) { + tag.putUUID(TAG_ACTIVATOR, this.activator); + tag.put(TAG_NEXT_BLOCK, NbtUtils.writeBlockPos(this.nextBlock)); + tag.put(TAG_COLORIZER, this.colorizer.serializeToNBT()); + tag.putBoolean(TAG_FOUND_ALL, this.foundAll); + + var trackeds = new ListTag(); + for (var tracked : this.trackedBlocks) { + trackeds.add(NbtUtils.writeBlockPos(tracked)); + } + tag.put(TAG_TRACKED_BLOCKS, trackeds); + } + + tag.putInt(TAG_MEDIA, this.media); + if (this.lastMishap != null) { + tag.putString(TAG_LAST_MISHAP, Component.Serializer.toJson(this.lastMishap)); + } + } + + @Override + protected void loadModData(CompoundTag tag) { + if (tag.contains(TAG_ACTIVATOR, Tag.TAG_INT_ARRAY) && + tag.contains(TAG_COLORIZER, Tag.TAG_COMPOUND) && + tag.contains(TAG_NEXT_BLOCK, Tag.TAG_COMPOUND) && + tag.contains(TAG_TRACKED_BLOCKS, Tag.TAG_LIST)) { + this.activator = tag.getUUID(TAG_ACTIVATOR); + this.colorizer = FrozenColorizer.fromNBT(tag.getCompound(TAG_COLORIZER)); + this.nextBlock = NbtUtils.readBlockPos(tag.getCompound(TAG_NEXT_BLOCK)); + this.foundAll = tag.getBoolean(TAG_FOUND_ALL); + var trackeds = tag.getList(TAG_TRACKED_BLOCKS, Tag.TAG_COMPOUND); + this.trackedBlocks = new ArrayList<>(trackeds.size()); + this.knownBlocks = new HashSet<>(); + for (var tracked : trackeds) { + var pos = NbtUtils.readBlockPos((CompoundTag) tracked); + this.trackedBlocks.add(pos); + this.knownBlocks.add(pos); + } + } else { + this.activator = null; + this.colorizer = null; + this.nextBlock = null; + this.foundAll = false; + this.trackedBlocks = new ArrayList<>(); + this.knownBlocks = new HashSet<>(); + } + + this.media = tag.getInt(TAG_MEDIA); + if (tag.contains(TAG_LAST_MISHAP, Tag.TAG_STRING)) { + this.lastMishap = Component.Serializer.fromJson(tag.getString(TAG_LAST_MISHAP)); + } else { + this.lastMishap = null; + } + } + + void stepCircle() { + this.setChanged(); + + // haha which silly idiot would have done something like this + if (this.activator == null || this.colorizer == null || this.nextBlock == null || this.trackedBlocks == null) { + return; + } + + var possibleErrorPos = this.checkEverythingOk(); + if (possibleErrorPos != null) { + this.sfx(possibleErrorPos, false); + this.stopCasting(); + return; + } + + if (this.foundAll) { + this.clearEnergized(); + this.castSpell(); + this.stopCasting(); + return; + } + + // This should only fail if we remove blocks halfway through casting + var bsHere = this.level.getBlockState(this.nextBlock); + if (!this.trackedBlocks.isEmpty() && bsHere.getBlock() instanceof BlockAbstractImpetus) { + // no two impetuses! + this.sfx(this.nextBlock, false); + this.stopCasting(); + return; + } + var blockHere = bsHere.getBlock(); + if (!(blockHere instanceof BlockCircleComponent cc)) { + this.sfx(this.nextBlock, false); + this.stopCasting(); + return; + } + // Awesome we know this block is OK + var thisNormal = cc.normalDir(this.nextBlock, bsHere, this.level); + var possibleExits = cc.exitDirections(this.nextBlock, bsHere, this.level); + BlockPos foundPos = null; + for (var exit : possibleExits) { + var neighborPos = this.nextBlock.relative(exit); + var blockThere = this.level.getBlockState(neighborPos); + // at this point, we haven't actually added nextBlock to trackedBlocks + // so, in the smallest circle case (a 2x2), this will have a size of 3 (with this block being the 4th). + var closedLoop = (this.trackedBlocks.size() >= 3 && this.trackedBlocks.get(0).equals(neighborPos)); + var mightBeOkThere = closedLoop + || this.trackedBlocks.isEmpty() + || !this.trackedBlocks.get(this.trackedBlocks.size() - 1).equals(neighborPos); + if (mightBeOkThere + && blockThere.getBlock() instanceof BlockCircleComponent cc2 + && cc2.canEnterFromDirection(exit.getOpposite(), thisNormal, neighborPos, blockThere, this.level) + // another good use for the implies operator 😩 + && (!blockThere.getValue(BlockCircleComponent.ENERGIZED) || this.knownBlocks.contains(neighborPos))) { + if (foundPos == null) { + foundPos = neighborPos; + this.foundAll |= closedLoop; + } else { + // uh oh, fork in the road + this.sfx(this.nextBlock, false); + this.stopCasting(); + return; + } + } + } + if (foundPos != null) { + // pog + this.trackedBlocks.add(this.nextBlock); + this.knownBlocks.add(this.nextBlock); + this.nextBlock = foundPos; + } else { + // end of the line + this.sfx(this.nextBlock, false); + this.stopCasting(); + return; + } + + var lastPos = this.trackedBlocks.get(this.trackedBlocks.size() - 1); + var justTrackedBlock = this.level.getBlockState(lastPos); + this.level.setBlockAndUpdate(lastPos, justTrackedBlock.setValue(BlockCircleComponent.ENERGIZED, true)); + this.sfx(lastPos, true); + + this.level.scheduleTick(this.getBlockPos(), this.getBlockState().getBlock(), this.getTickSpeed()); + } + + private void castSpell() { + var player = this.getPlayer(); + + if (player instanceof ServerPlayer splayer) { + var bounds = getBounds(this.trackedBlocks); + + var ctx = new CastingContext(splayer, InteractionHand.MAIN_HAND, + new SpellCircleContext(this.getBlockPos(), bounds, this.activatorAlwaysInRange())); + var harness = new CastingHarness(ctx); + + BlockPos erroredPos = null; + for (var tracked : this.trackedBlocks) { + var bs = this.level.getBlockState(tracked); + if (bs.getBlock() instanceof BlockCircleComponent cc) { + var newPattern = cc.getPattern(tracked, bs, this.level); + if (newPattern != null) { + var info = harness.executeIota(new PatternIota(newPattern), splayer.getLevel()); + if (!info.getResolutionType().getSuccess()) { + erroredPos = tracked; + break; + } + } + } + } + + if (erroredPos != null) { + this.sfx(erroredPos, false); + } else { + this.setLastMishap(null); + } + + this.setChanged(); + } + } + + @Contract(pure = true) + private static AABB getBounds(List poses) { + int minX = Integer.MAX_VALUE; + int minY = Integer.MAX_VALUE; + int minZ = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int maxY = Integer.MIN_VALUE; + int maxZ = Integer.MIN_VALUE; + + for (var pos : poses) { + if (pos.getX() < minX) { + minX = pos.getX(); + } + if (pos.getY() < minY) { + minY = pos.getY(); + } + if (pos.getZ() < minZ) { + minZ = pos.getZ(); + } + if (pos.getX() > maxX) { + maxX = pos.getX(); + } + if (pos.getY() > maxY) { + maxY = pos.getY(); + } + if (pos.getZ() > maxZ) { + maxZ = pos.getZ(); + } + } + + return new AABB(minX, minY, minZ, maxX + 1, maxY + 1, maxZ + 1); + } + + @Nullable + private BlockPos checkEverythingOk() { + // if they logged out or changed dimensions or something + if (this.getPlayer() == null) { + return this.getBlockPos(); + } + + for (var pos : this.trackedBlocks) { + if (!(this.level.getBlockState(pos).getBlock() instanceof BlockCircleComponent)) { + return pos; + } + } + + if (this.trackedBlocks.size() > HexConfig.server().maxSpellCircleLength()) { + return this.trackedBlocks.get(this.trackedBlocks.size() - 1); + } + + return null; + } + + private void sfx(BlockPos pos, boolean success) { + Vec3 vpos; + Vec3 vecOutDir; + + var bs = this.level.getBlockState(pos); + if (bs.getBlock() instanceof BlockCircleComponent bcc) { + var outDir = bcc.normalDir(pos, bs, this.level); + var height = bcc.particleHeight(pos, bs, this.level); + vecOutDir = new Vec3(outDir.step()); + vpos = Vec3.atCenterOf(pos).add(vecOutDir.scale(height)); + } else { + // we probably are doing this because it's an error and we removed a block + vpos = Vec3.atCenterOf(pos); + vecOutDir = new Vec3(0, 0, 0); + } + + if (this.level instanceof ServerLevel serverLevel) { + var spray = new ParticleSpray(vpos, vecOutDir.scale(success ? 1.0 : 1.5), success ? 0.1 : 0.5, + Mth.PI / (success ? 4 : 2), success ? 30 : 100); + spray.sprayParticles(serverLevel, + success ? this.colorizer : new FrozenColorizer(new ItemStack(HexItems.DYE_COLORIZERS.get(DyeColor.RED)), + this.activator)); + } + + var pitch = 1f; + var sound = HexSounds.SPELL_CIRCLE_FAIL; + if (success) { + sound = HexSounds.SPELL_CIRCLE_FIND_BLOCK; + // This is a good use of my time + var note = this.trackedBlocks.size() - 1; + var semitone = this.semitoneFromScale(note); + pitch = (float) Math.pow(2.0, (semitone - 8) / 12d); + } + level.playSound(null, vpos.x, vpos.y, vpos.z, sound, SoundSource.BLOCKS, 1f, pitch); + } + + protected void clearEnergized() { + if (this.trackedBlocks != null) { + for (var tracked : this.trackedBlocks) { + var bs = this.level.getBlockState(tracked); + if (bs.getBlock() instanceof BlockCircleComponent) { + this.level.setBlockAndUpdate(tracked, bs.setValue(BlockCircleComponent.ENERGIZED, false)); + } + } + } + } + + protected void stopCasting() { + clearEnergized(); + + this.activator = null; + this.nextBlock = null; + this.trackedBlocks = null; + this.foundAll = false; + + // without this check, breaking the block will just immediately replace it with + // the new unenergized state + if (this.level.getBlockState(this.getBlockPos()).getBlock() instanceof BlockAbstractImpetus) { + this.level.setBlockAndUpdate(this.getBlockPos(), + this.getBlockState().setValue(BlockCircleComponent.ENERGIZED, false)); + } + } + + @Nullable + protected Player getPlayer() { + return this.level.getPlayerByUUID(this.activator); + } + + protected int getTickSpeed() { + if (this.trackedBlocks == null) { + return 10; + } else { + return Math.max(2, 10 - trackedBlocks.size() / 3); + } + } + + protected int semitoneFromScale(int note) { + var blockBelow = this.level.getBlockState(this.getBlockPos().below()); + var scale = MAJOR_SCALE; + if (blockBelow.is(Blocks.CRYING_OBSIDIAN)) { + scale = MINOR_SCALE; + } else if (blockBelow.is(BlockTags.DOORS) || blockBelow.is(BlockTags.TRAPDOORS)) { + scale = DORIAN_SCALE; + } else if (blockBelow.is(Blocks.PISTON) || blockBelow.is(Blocks.STICKY_PISTON)) { + scale = MIXOLYDIAN_SCALE; + } else if (blockBelow.is(Blocks.BLUE_WOOL) + || blockBelow.is(Blocks.BLUE_CONCRETE) || blockBelow.is(Blocks.BLUE_CONCRETE_POWDER) + || blockBelow.is(Blocks.BLUE_TERRACOTTA) || blockBelow.is(Blocks.BLUE_GLAZED_TERRACOTTA) + || blockBelow.is(Blocks.BLUE_STAINED_GLASS) || blockBelow.is(Blocks.BLUE_STAINED_GLASS_PANE)) { + scale = BLUES_SCALE; + } else if (blockBelow.is(Blocks.BONE_BLOCK)) { + scale = BAD_TIME; + } else if (blockBelow.is(Blocks.COMPOSTER)) { + scale = SUSSY_BAKA; + } + + note = Mth.clamp(note, 0, scale.length - 1); + return scale[note]; + } + + // this is a good use of my time + private static final int[] MAJOR_SCALE = {0, 2, 4, 5, 7, 9, 11, 12}; + private static final int[] MINOR_SCALE = {0, 2, 3, 5, 7, 8, 11, 12}; + private static final int[] DORIAN_SCALE = {0, 2, 3, 5, 7, 9, 10, 12}; + private static final int[] MIXOLYDIAN_SCALE = {0, 2, 4, 5, 7, 9, 10, 12}; + private static final int[] BLUES_SCALE = {0, 3, 5, 6, 7, 10, 12}; + private static final int[] BAD_TIME = {0, 0, 12, 7, 6, 5, 3, 0, 3, 5}; + private static final int[] SUSSY_BAKA = {5, 8, 10, 11, 10, 8, 5, 3, 7, 5}; + + private static final int[] SLOTS = {0}; + + @Override + public int[] getSlotsForFace(Direction var1) { + return SLOTS; + } + + @Override + public boolean canPlaceItemThroughFace(int index, ItemStack stack, @Nullable Direction dir) { + return this.canPlaceItem(index, stack); + } + + @Override + public boolean canTakeItemThroughFace(int var1, ItemStack var2, Direction var3) { + return false; + } + + @Override + public int getContainerSize() { + return 1; + } + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public ItemStack getItem(int index) { + return ItemStack.EMPTY.copy(); + } + + @Override + public ItemStack removeItem(int index, int count) { + return ItemStack.EMPTY.copy(); + } + + @Override + public ItemStack removeItemNoUpdate(int index) { + return ItemStack.EMPTY.copy(); + } + + @Override + public void setItem(int index, ItemStack stack) { + insertMedia(stack); + } + + @Override + public boolean stillValid(Player player) { + return false; + } + + @Override + public void clearContent() { + // NO-OP + } + + @Override + public boolean canPlaceItem(int index, ItemStack stack) { + if (remainingMediaCapacity() == 0) { + return false; + } + + if (stack.is(HexItems.CREATIVE_UNLOCKER)) { + return true; + } + + var mediamount = extractMediaFromItem(stack, true); + return mediamount > 0; + } + + public int extractMediaFromItem(ItemStack stack, boolean simulate) { + if (this.media < 0) { + return 0; + } + return MediaHelper.extractMedia(stack, remainingMediaCapacity(), true, simulate); + } + + public void insertMedia(ItemStack stack) { + if (getMedia() >= 0 && !stack.isEmpty() && stack.getItem() == HexItems.CREATIVE_UNLOCKER) { + setInfiniteMedia(); + stack.shrink(1); + } else { + var mediamount = extractMediaFromItem(stack, false); + if (mediamount > 0) { + this.media = Math.min(mediamount + media, MAX_CAPACITY); + this.sync(); + } + } + } + + public void setInfiniteMedia() { + this.media = -1; + this.sync(); + } + + public int remainingMediaCapacity() { + if (this.media < 0) { + return 0; + } + return Math.max(0, MAX_CAPACITY - this.media); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/client/ScryingLensOverlayRegistry.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/client/ScryingLensOverlayRegistry.java new file mode 100644 index 00000000..88cc62df --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/client/ScryingLensOverlayRegistry.java @@ -0,0 +1,191 @@ +package at.petrak.hexcasting.api.client; + +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import com.google.common.collect.Lists; +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.Minecraft; +import net.minecraft.world.level.Level; +import net.minecraft.world.entity.player.Player; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BeehiveBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; +import java.util.Vector; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * Use this to make things display when the player looks at things with a Scrying Lens. + *

+ * Client-side only. + */ +public final class ScryingLensOverlayRegistry { + private static final ConcurrentMap ID_LOOKUP = new ConcurrentHashMap<>(); + // vectors are thread-safe! + private static final List> PREDICATE_LOOKUP = new Vector<>(); + + // implemented as a map to allow for weak dereferencing + private static final Map> comparatorData = new WeakHashMap<>(); + private static final Map> beeData = new WeakHashMap<>(); + + public static void receiveComparatorAndBeeValue(BlockPos pos, int comparator, int bee) { + Player player = Minecraft.getInstance().player; + if (player != null) { + if (pos == null || comparator == -1) { + comparatorData.remove(player); + } else { + comparatorData.put(player, new Pair<>(pos, comparator)); + } + + if (pos == null || bee == -1) { + beeData.remove(player); + } else { + beeData.put(player, new Pair<>(pos, bee)); + } + } + } + + public static int getComparatorValue(boolean onlyRealComparators) { + var mc = Minecraft.getInstance(); + var player = mc.player; + var level = mc.level; + var result = mc.hitResult; + + if (player == null || level == null || result == null || result.getType() != HitResult.Type.BLOCK) { + return -1; + } + + var comparatorValue = comparatorData.get(player); + if (comparatorValue == null) { + return -1; + } + + var pos = ((BlockHitResult) result).getBlockPos(); + if (!pos.equals(comparatorValue.getFirst())) { + return -1; + } + + var state = mc.level.getBlockState(pos); + if ((onlyRealComparators && !state.is( + Blocks.COMPARATOR)) || (!onlyRealComparators && !state.hasAnalogOutputSignal())) { + return -1; + } + + return comparatorValue.getSecond(); + } + + public static int getBeeValue() { + var mc = Minecraft.getInstance(); + var player = mc.player; + var level = mc.level; + var result = mc.hitResult; + + if (player == null || level == null || result == null || result.getType() != HitResult.Type.BLOCK) { + return -1; + } + + var beeValue = beeData.get(player); + if (beeValue == null) { + return -1; + } + + var pos = ((BlockHitResult) result).getBlockPos(); + if (!pos.equals(beeValue.getFirst())) { + return -1; + } + + var state = mc.level.getBlockState(pos); + if (!(state.getBlock() instanceof BeehiveBlock)) { + return -1; + } + + return beeValue.getSecond(); + } + + /** + * Add the block to display things when the player is holding a lens and looking at it. + * + * @throws IllegalArgumentException if the block is already registered. + */ + public static void addDisplayer(Block block, OverlayBuilder displayer) { + addDisplayer(IXplatAbstractions.INSTANCE.getID(block), displayer); + } + + /** + * Add the block to display things when the player is holding a lens and looking at it. + * + * @throws IllegalArgumentException if the block ID is already registered. + */ + public static void addDisplayer(ResourceLocation blockID, OverlayBuilder displayer) { + if (ID_LOOKUP.containsKey(blockID)) { + throw new IllegalArgumentException("Already have a displayer for " + blockID); + } + ID_LOOKUP.put(blockID, displayer); + } + + /** + * Display things when the player is holding a lens and looking at some block via a predicate. + *

+ * These have a lower priority than the standard ID-based displays, so if an ID and predicate both match, + * this won't be displayed. + */ + public static void addPredicateDisplayer(OverlayPredicate predicate, OverlayBuilder displayer) { + PREDICATE_LOOKUP.add(new Pair<>(predicate, displayer)); + } + + /** + * Internal use only. + */ + public static @NotNull List> getLines(BlockState state, BlockPos pos, + Player observer, Level world, + Direction hitFace) { + List> lines = Lists.newArrayList(); + var idLookedup = ID_LOOKUP.get(IXplatAbstractions.INSTANCE.getID(state.getBlock())); + if (idLookedup != null) { + idLookedup.addLines(lines, state, pos, observer, world, hitFace); + } + + for (var pair : PREDICATE_LOOKUP) { + if (pair.getFirst().test(state, pos, observer, world, hitFace)) { + pair.getSecond().addLines(lines, state, pos, observer, world, hitFace); + } + } + + return lines; + } + + /** + * Return the lines displayed by the cursor: an item and some text. + *

+ * The ItemStack can be empty; if it is, the text isn't shifted over for it. + */ + @FunctionalInterface + public interface OverlayBuilder { + void addLines(List> lines, + BlockState state, BlockPos pos, Player observer, + Level world, + Direction hitFace); + } + + /** + * Predicate for matching on a block state. + */ + @FunctionalInterface + public interface OverlayPredicate { + boolean test(BlockState state, BlockPos pos, Player observer, + Level world, + Direction hitFace); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/ColorizerItem.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/ColorizerItem.java new file mode 100644 index 00000000..bcfd4dde --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/ColorizerItem.java @@ -0,0 +1,18 @@ +package at.petrak.hexcasting.api.item; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.ApiStatus; + +import java.util.UUID; + +/** + * Items which can be used as a colorizer can implement this interface. + *

+ * On both the Forge and Fabric sides, the registry will be scanned for all items which implement this interface, + * and the appropriate cap/CC will be attached. + */ +@ApiStatus.OverrideOnly +public interface ColorizerItem { + int color(ItemStack stack, UUID owner, float time, Vec3 position); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/HexHolderItem.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/HexHolderItem.java new file mode 100644 index 00000000..bf276235 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/HexHolderItem.java @@ -0,0 +1,30 @@ +package at.petrak.hexcasting.api.item; + +import at.petrak.hexcasting.api.spell.iota.Iota; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Items which can cast a packaged Hex can implement this interface. + *

+ * On both the Forge and Fabric sides, the registry will be scanned for all items which implement this interface, + * and the appropriate cap/CC will be attached. + */ +@ApiStatus.OverrideOnly +public interface HexHolderItem extends MediaHolderItem { + + boolean canDrawMediaFromInventory(ItemStack stack); + + boolean hasHex(ItemStack stack); + + @Nullable + List getHex(ItemStack stack, ServerLevel level); + + void writeHex(ItemStack stack, List program, int media); + + void clearHex(ItemStack stack); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java new file mode 100644 index 00000000..3aeef986 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java @@ -0,0 +1,114 @@ +package at.petrak.hexcasting.api.item; + +import at.petrak.hexcasting.api.spell.iota.Iota; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.utils.NBTHelper; +import at.petrak.hexcasting.client.ClientTickCounter; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Items that store an iota to their tag can implement this interface. + *

+ * On both the Forge and Fabric sides, the registry will be scanned for all items which implement this interface, + * and the appropriate cap/CC will be attached. + */ +public interface IotaHolderItem { + /** + * If this key is set on the item, we ignore the rest of the item and render this as if it were of the + * {@link at.petrak.hexcasting.api.spell.iota.IotaType IotaType} given by the resource location. + *

+ * This is not useful to the player at all. + */ + String TAG_OVERRIDE_VISUALLY = "VisualOverride"; + + @Nullable + CompoundTag readIotaTag(ItemStack stack); + + @Nullable + default Iota readIota(ItemStack stack, ServerLevel world) { + if (!(stack.getItem() instanceof IotaHolderItem dh)) { + // this should be checked via mishap beforehand + throw new IllegalArgumentException("stack's item must be an IotaHolderItem but was " + stack.getItem()); + } + + var tag = dh.readIotaTag(stack); + if (tag != null) { + return HexIotaTypes.deserialize(tag, world); + } else { + return null; + } + } + + /** + * What is this considered to contain when nothing can be read? + *

+ * TODO i'm not sure what this exists for + */ + @Nullable + default Iota emptyIota(ItemStack stack) { + return null; + } + + default int getColor(ItemStack stack) { + if (NBTHelper.hasString(stack, TAG_OVERRIDE_VISUALLY)) { + var override = NBTHelper.getString(stack, TAG_OVERRIDE_VISUALLY); + + if (override != null && ResourceLocation.isValidResourceLocation(override)) { + var key = new ResourceLocation(override); + if (HexIotaTypes.REGISTRY.containsKey(key)) { + var iotaType = HexIotaTypes.REGISTRY.get(key); + if (iotaType != null) { + return iotaType.color(); + } + } + } + + return 0xFF000000 | Mth.hsvToRgb(ClientTickCounter.getTotal() * 2 % 360 / 360F, 0.75F, 1F); + } + + var tag = this.readIotaTag(stack); + if (tag == null) { + return HexUtils.ERROR_COLOR; + } + + return HexIotaTypes.getColor(tag); + } + + /** + * Write {@code null} to indicate erasing + */ + boolean canWrite(ItemStack stack, @Nullable Iota iota); + + /** + * Write {@code null} to indicate erasing + */ + void writeDatum(ItemStack stack, @Nullable Iota iota); + + static void appendHoverText(IotaHolderItem self, ItemStack stack, List components, + TooltipFlag flag) { + var datumTag = self.readIotaTag(stack); + if (datumTag != null) { + var cmp = HexIotaTypes.getDisplay(datumTag); + components.add(Component.translatable("hexcasting.spelldata.onitem", cmp)); + + if (flag.isAdvanced()) { + components.add(Component.literal("").append(NbtUtils.toPrettyComponent(datumTag))); + } + } else if (NBTHelper.hasString(stack, IotaHolderItem.TAG_OVERRIDE_VISUALLY)) { + components.add(Component.translatable("hexcasting.spelldata.onitem", + Component.translatable("hexcasting.spelldata.anything").withStyle(ChatFormatting.LIGHT_PURPLE))); + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/MediaHolderItem.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/MediaHolderItem.java new file mode 100644 index 00000000..43456722 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/item/MediaHolderItem.java @@ -0,0 +1,62 @@ +package at.petrak.hexcasting.api.item; + +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.ApiStatus; + +/** + * Items which can store Media can implement this interface. + *

+ * On both the Forge and Fabric sides, the registry will be scanned for all items which implement this interface, + * and the appropriate cap/CC will be attached. + */ +@ApiStatus.OverrideOnly +public interface MediaHolderItem { + int getMedia(ItemStack stack); + + int getMaxMedia(ItemStack stack); + + void setMedia(ItemStack stack, int media); + + boolean canProvideMedia(ItemStack stack); + + boolean canRecharge(ItemStack stack); + + default float getMediaFullness(ItemStack stack) { + int max = getMaxMedia(stack); + if (max == 0) { + return 0; + } + return (float) getMedia(stack) / (float) max; + } + + default int withdrawMedia(ItemStack stack, int cost, boolean simulate) { + var mediaHere = getMedia(stack); + if (cost < 0) { + cost = mediaHere; + } + if (!simulate) { + var mediaLeft = mediaHere - cost; + setMedia(stack, mediaLeft); + } + return Math.min(cost, mediaHere); + } + + default int insertMedia(ItemStack stack, int amount, boolean simulate) { + var mediaHere = getMedia(stack); + int emptySpace = getMaxMedia(stack) - mediaHere; + if (emptySpace <= 0) { + return 0; + } + if (amount < 0) { + amount = emptySpace; + } + + int inserting = Math.min(amount, emptySpace); + + if (!simulate) { + var newMedia = mediaHere + inserting; + setMedia(stack, newMedia); + } + return inserting; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceOvercast.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceOvercast.java new file mode 100644 index 00000000..9cd89eea --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceOvercast.java @@ -0,0 +1,12 @@ +package at.petrak.hexcasting.api.misc; + +import net.minecraft.world.damagesource.DamageSource; + +public class DamageSourceOvercast extends DamageSource { + public DamageSourceOvercast() { + super("hexcasting.overcast"); + this.bypassArmor(); + this.bypassMagic(); + this.setMagic(); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceShameOnYou.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceShameOnYou.java new file mode 100644 index 00000000..32595b85 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DamageSourceShameOnYou.java @@ -0,0 +1,12 @@ +package at.petrak.hexcasting.api.misc; + +import net.minecraft.world.damagesource.DamageSource; + +public class DamageSourceShameOnYou extends DamageSource { + public DamageSourceShameOnYou() { + super("hexcasting.shame"); + this.bypassArmor(); + this.bypassMagic(); + this.setMagic(); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DiscoveryHandlers.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DiscoveryHandlers.java new file mode 100644 index 00000000..f231fe6f --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/DiscoveryHandlers.java @@ -0,0 +1,103 @@ +package at.petrak.hexcasting.api.misc; + +import at.petrak.hexcasting.api.addldata.ADMediaHolder; +import at.petrak.hexcasting.api.spell.casting.CastingContext; +import at.petrak.hexcasting.api.spell.casting.CastingHarness; +import com.google.common.collect.Lists; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; + +public class DiscoveryHandlers { + private static final List> HAS_LENS_PREDICATE = new ArrayList<>(); + private static final List>> MEDIA_HOLDER_DISCOVERY = new ArrayList<>(); + private static final List> GRID_SCALE_MODIFIERS = new ArrayList<>(); + private static final List>> ITEM_SLOT_DISCOVERER = new ArrayList<>(); + private static final List>> OPERATIVE_SLOT_DISCOVERER = new ArrayList<>(); + private static final List> DEBUG_DISCOVERER = new ArrayList<>(); + + public static boolean hasLens(Player player) { + for (var predicate : HAS_LENS_PREDICATE) { + if (predicate.test(player)) { + return true; + } + } + return false; + } + + public static List collectMediaHolders(CastingHarness harness) { + List holders = Lists.newArrayList(); + for (var discoverer : MEDIA_HOLDER_DISCOVERY) { + holders.addAll(discoverer.apply(harness)); + } + return holders; + } + + public static float gridScaleModifier(Player player) { + float mod = 1; + for (var modifier : GRID_SCALE_MODIFIERS) { + mod *= modifier.apply(player); + } + return mod; + } + + public static List collectItemSlots(CastingContext ctx) { + List stacks = Lists.newArrayList(); + for (var discoverer : ITEM_SLOT_DISCOVERER) { + stacks.addAll(discoverer.apply(ctx)); + } + return stacks; + } + + public static List collectOperableSlots(CastingContext ctx) { + List stacks = Lists.newArrayList(); + for (var discoverer : OPERATIVE_SLOT_DISCOVERER) { + stacks.addAll(discoverer.apply(ctx)); + } + return stacks; + } + + public static ItemStack findDebugItem(Player player, String type) { + for (var discoverer : DEBUG_DISCOVERER) { + var stack = discoverer.apply(player, type); + if (!stack.isEmpty()) { + return stack; + } + } + return ItemStack.EMPTY; + } + + public static void addLensPredicate(Predicate predicate) { + HAS_LENS_PREDICATE.add(predicate); + } + + public static void addMediaHolderDiscoverer(Function> discoverer) { + MEDIA_HOLDER_DISCOVERY.add(discoverer); + } + + public static void addGridScaleModifier(FunctionToFloat modifier) { + GRID_SCALE_MODIFIERS.add(modifier); + } + + public static void addItemSlotDiscoverer(Function> discoverer) { + ITEM_SLOT_DISCOVERER.add(discoverer); + } + + public static void addOperativeSlotDiscoverer(Function> discoverer) { + OPERATIVE_SLOT_DISCOVERER.add(discoverer); + } + + public static void addDebugItemDiscoverer(BiFunction discoverer) { + DEBUG_DISCOVERER.add(discoverer); + } + + @FunctionalInterface + public interface FunctionToFloat { + float apply(T t); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/EntityDamageSourceOvercast.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/EntityDamageSourceOvercast.java new file mode 100644 index 00000000..659ccbff --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/EntityDamageSourceOvercast.java @@ -0,0 +1,13 @@ +package at.petrak.hexcasting.api.misc; + +import net.minecraft.world.damagesource.EntityDamageSource; +import net.minecraft.world.entity.Entity; + +public class EntityDamageSourceOvercast extends EntityDamageSource { + public EntityDamageSourceOvercast(Entity entity) { + super("hexcasting.overcast", entity); + this.bypassArmor(); + this.bypassMagic(); + this.setMagic(); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/FrozenColorizer.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/FrozenColorizer.java new file mode 100644 index 00000000..ce2603f9 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/FrozenColorizer.java @@ -0,0 +1,78 @@ +package at.petrak.hexcasting.api.misc; + +import at.petrak.hexcasting.api.addldata.ADColorizer; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.FastColor; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +import java.util.UUID; +import java.util.function.Supplier; + +/** + * A colorizer item and the player who owned it at the time of making the color. + */ +public record FrozenColorizer(ItemStack item, UUID owner) { + + private static final int[] MINIMUM_LUMINANCE_COLOR_WHEEL = { + 0xFF200000, 0xFF202000, 0xFF002000, 0xFF002020, 0xFF000020, 0xFF200020 + }; + + public static final String TAG_STACK = "stack"; + public static final String TAG_OWNER = "owner"; + + public static final Supplier DEFAULT = + () -> new FrozenColorizer(new ItemStack(HexItems.DYE_COLORIZERS.get(DyeColor.WHITE)), Util.NIL_UUID); + + public CompoundTag serializeToNBT() { + var out = new CompoundTag(); + out.put(TAG_STACK, this.item.save(new CompoundTag())); + out.putUUID(TAG_OWNER, this.owner); + return out; + } + + public static FrozenColorizer fromNBT(CompoundTag tag) { + if (tag.isEmpty()) { + return FrozenColorizer.DEFAULT.get(); + } + try { + CompoundTag stackTag = tag.getCompound(TAG_STACK); + var stack = ItemStack.of(stackTag); + var uuid = tag.getUUID(TAG_OWNER); + return new FrozenColorizer(stack, uuid); + } catch (NullPointerException exn) { + return FrozenColorizer.DEFAULT.get(); + } + } + + /** + * Gets a color with a minimum luminance applied. + * + * @param time absolute world time in ticks + * @param position a position for the icosahedron, a randomish number for particles. + * @return an AARRGGBB color. + */ + public int getColor(float time, Vec3 position) { + int raw = IXplatAbstractions.INSTANCE.getRawColor(this, time, position); + + var r = FastColor.ARGB32.red(raw); + var g = FastColor.ARGB32.green(raw); + var b = FastColor.ARGB32.blue(raw); + double luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 0xFF; // Standard relative luminance calculation + + if (luminance < 0.05) { + int rawMod = ADColorizer.morphBetweenColors(MINIMUM_LUMINANCE_COLOR_WHEEL, new Vec3(0.1, 0.1, 0.1), + time / 20 / 20, position); + + r += FastColor.ARGB32.red(rawMod); + g += FastColor.ARGB32.green(rawMod); + b += FastColor.ARGB32.blue(rawMod); + } + + return 0xff_000000 | (r << 16) | (g << 8) | b; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/HexDamageSources.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/HexDamageSources.java new file mode 100644 index 00000000..8dd06719 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/HexDamageSources.java @@ -0,0 +1,13 @@ +package at.petrak.hexcasting.api.misc; + +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; + +public final class HexDamageSources { + public static final DamageSourceOvercast OVERCAST = new DamageSourceOvercast(); + public static final DamageSourceShameOnYou SHAME = new DamageSourceShameOnYou(); + + public static DamageSource overcastDamageFrom(Entity cause) { + return new EntityDamageSourceOvercast(cause); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/MediaConstants.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/MediaConstants.java new file mode 100644 index 00000000..322a9c82 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/MediaConstants.java @@ -0,0 +1,7 @@ +package at.petrak.hexcasting.api.misc; + +public final class MediaConstants { + public static final int DUST_UNIT = 10000; + public static final int SHARD_UNIT = 5 * DUST_UNIT; + public static final int CRYSTAL_UNIT = 10 * DUST_UNIT; +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/ScrollQuantity.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/ScrollQuantity.java new file mode 100644 index 00000000..bc262ea3 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/ScrollQuantity.java @@ -0,0 +1,24 @@ +package at.petrak.hexcasting.api.misc; + +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public enum ScrollQuantity { + NONE(null), + FEW(modLoc("inject/scroll_loot_few")), + SOME(modLoc("inject/scroll_loot_some")), + MANY(modLoc("inject/scroll_loot_many")); + + private final ResourceLocation pool; + + ScrollQuantity(ResourceLocation pool) { + this.pool = pool; + } + + @Nullable + public ResourceLocation getPool() { + return pool; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/TriPredicate.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/TriPredicate.java new file mode 100644 index 00000000..04f70220 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/misc/TriPredicate.java @@ -0,0 +1,9 @@ +package at.petrak.hexcasting.api.misc; + +/** + * Society if java actually had first-class function support + */ +@FunctionalInterface +public interface TriPredicate { + boolean test(A a, B b, C c); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexApiMessages.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexApiMessages.java new file mode 100644 index 00000000..44c04c79 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexApiMessages.java @@ -0,0 +1,51 @@ +package at.petrak.hexcasting.api.mod; + +// Don't understand what this does so i commented it all out :gigachad: +/* + +import at.petrak.hexcasting.api.misc.FrozenColorizer; +import at.petrak.hexcasting.api.player.Sentinel; +import at.petrak.hexcasting.api.spell.ParticleSpray; +import net.minecraftforge.network.simple.SimpleChannel; +import org.jetbrains.annotations.ApiStatus; + +import java.util.function.BiFunction; +import java.util.function.Function; + +@ApiStatus.Internal +public final class HexApiMessages { + private static SimpleChannel channel; + private static Function sentinelMessage; + private static Function colorizerMessage; + private static BiFunction particleSprayMessage; + + public static void setSyncChannel(SimpleChannel channel, + Function sentinelMessage, + Function colorizerMessage, + BiFunction particleSprayMessage) { + if (HexApiMessages.channel != null) + throw new IllegalStateException("Already set sync channel! If you're not Hex, you shouldn't be calling this."); + HexApiMessages.channel = channel; + HexApiMessages.sentinelMessage = sentinelMessage; + HexApiMessages.colorizerMessage = colorizerMessage; + HexApiMessages.particleSprayMessage = particleSprayMessage; + } + + public static SimpleChannel getChannel() { + return channel; + } + + public static Object getColorizerMessage(FrozenColorizer colorizer) { + return colorizerMessage.apply(colorizer); + } + + public static Object getSentinelMessage(Sentinel colorizer) { + return sentinelMessage.apply(colorizer); + } + + public static Object getParticleSprayMessage(ParticleSpray spray, FrozenColorizer colorizer) { + return particleSprayMessage.apply(spray, colorizer); + } +} + + */ diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java new file mode 100644 index 00000000..aec2c2ca --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -0,0 +1,139 @@ +package at.petrak.hexcasting.api.mod; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.api.misc.MediaConstants; +import at.petrak.hexcasting.api.misc.ScrollQuantity; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.level.Level; + +import java.util.List; + +public class HexConfig { + public interface CommonConfigAccess { + + int dustMediaAmount(); + + int shardMediaAmount(); + + int chargedCrystalMediaAmount(); + + double mediaToHealthRate(); + + int DEFAULT_DUST_MEDIA_AMOUNT = MediaConstants.DUST_UNIT; + int DEFAULT_SHARD_MEDIA_AMOUNT = MediaConstants.SHARD_UNIT; + int DEFAULT_CHARGED_MEDIA_AMOUNT = MediaConstants.CRYSTAL_UNIT; + double DEFAULT_MEDIA_TO_HEALTH_RATE = 2 * MediaConstants.CRYSTAL_UNIT / 20.0; + + } + + public interface ClientConfigAccess { + boolean ctrlTogglesOffStrokeOrder(); + + boolean invertSpellbookScrollDirection(); + + boolean invertAbacusScrollDirection(); + + double gridSnapThreshold(); + + 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; + } + + public interface ServerConfigAccess { + int opBreakHarvestLevelBecauseForgeThoughtItWasAGoodIdeaToImplementHarvestTiersUsingAnHonestToGodTopoSort(); + + int maxRecurseDepth(); + + int maxSpellCircleLength(); + + boolean isActionAllowed(ResourceLocation actionID); + + boolean isActionAllowedInCircles(ResourceLocation actionID); + + boolean doVillagersTakeOffenseAtMindMurder(); + + // fun fact, although dimension keys are a RegistryHolder, they aren't a registry, so i can't do tags + boolean canTeleportInThisDimension(ResourceKey dimension); + + ScrollQuantity scrollsForLootTable(ResourceLocation lootTable); + + int DEFAULT_MAX_RECURSE_DEPTH = 512; + int DEFAULT_MAX_SPELL_CIRCLE_LENGTH = 1024; + int DEFAULT_OP_BREAK_HARVEST_LEVEL = 3; + + boolean DEFAULT_VILLAGERS_DISLIKE_MIND_MURDER = true; + List DEFAULT_FEW_SCROLL_TABLES = List.of("minecraft:chests/jungle_temple", + "minecraft:chests/simple_dungeon", "minecraft:chests/village/village_cartographer"); + List DEFAULT_SOME_SCROLL_TABLES = List.of("minecraft:chests/bastion_treasure", + "minecraft:chests/shipwreck_map"); + List DEFAULT_MANY_SCROLL_TABLES = List.of("minecraft:chests/stronghold_library"); + + List DEFAULT_DIM_TP_DENYLIST = List.of("twilightforest:twilight_forest"); + + default Tier opBreakHarvestLevel() { + return switch (this.opBreakHarvestLevelBecauseForgeThoughtItWasAGoodIdeaToImplementHarvestTiersUsingAnHonestToGodTopoSort()) { + case 0 -> Tiers.WOOD; + case 1 -> Tiers.STONE; + case 2 -> Tiers.IRON; + case 3 -> Tiers.DIAMOND; + case 4 -> Tiers.NETHERITE; + default -> throw new RuntimeException("please only return a value in 0<=x<=4"); + }; + } + } + + // Simple extensions for resource location configs + public static boolean anyMatch(List keys, ResourceLocation key) { + return keys.stream().map(ResourceLocation::new).anyMatch(key::equals); + } + + public static boolean noneMatch(List keys, ResourceLocation key) { + return keys.stream().map(ResourceLocation::new).noneMatch(key::equals); + } + + // oh man this is aesthetically pleasing + private static CommonConfigAccess common = null; + private static ClientConfigAccess client = null; + private static ServerConfigAccess server = null; + + public static CommonConfigAccess common() { + return common; + } + + public static ClientConfigAccess client() { + return client; + } + + public static ServerConfigAccess server() { + return server; + } + + public static void setCommon(CommonConfigAccess access) { + if (common != null) { + HexAPI.LOGGER.warn("CommonConfigAccess was replaced! Old {} New {}", + common.getClass().getName(), access.getClass().getName()); + } + common = access; + } + + public static void setClient(ClientConfigAccess access) { + if (client != null) { + HexAPI.LOGGER.warn("ClientConfigAccess was replaced! Old {} New {}", + client.getClass().getName(), access.getClass().getName()); + } + client = access; + } + + public static void setServer(ServerConfigAccess access) { + if (server != null) { + HexAPI.LOGGER.warn("ServerConfigAccess was replaced! Old {} New {}", + server.getClass().getName(), access.getClass().getName()); + } + server = access; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexStatistics.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexStatistics.java new file mode 100644 index 00000000..5262980d --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexStatistics.java @@ -0,0 +1,29 @@ +package at.petrak.hexcasting.api.mod; + +import at.petrak.hexcasting.api.misc.MediaConstants; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.stats.StatFormatter; +import net.minecraft.stats.Stats; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class HexStatistics { + public static final ResourceLocation MEDIA_USED = makeCustomStat("media_used", + mediamount -> StatFormatter.DEFAULT.format(mediamount / MediaConstants.DUST_UNIT)); + public static final ResourceLocation MEDIA_OVERCAST = makeCustomStat("media_overcast", + mediamount -> StatFormatter.DEFAULT.format(mediamount / MediaConstants.DUST_UNIT)); + public static final ResourceLocation PATTERNS_DRAWN = makeCustomStat("patterns_drawn", StatFormatter.DEFAULT); + public static final ResourceLocation SPELLS_CAST = makeCustomStat("spells_cast", StatFormatter.DEFAULT); + + public static void register() { + // wake up java + } + + private static ResourceLocation makeCustomStat(String key, StatFormatter formatter) { + ResourceLocation resourcelocation = modLoc(key); + Registry.register(Registry.CUSTOM_STAT, key, resourcelocation); + Stats.CUSTOM.get(resourcelocation, formatter); + return resourcelocation; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java new file mode 100644 index 00000000..41df2c90 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java @@ -0,0 +1,46 @@ +package at.petrak.hexcasting.api.mod; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class HexTags { + public static final class Items { + public static final TagKey EDIFIED_LOGS = create("edified_logs"); + public static final TagKey EDIFIED_PLANKS = create("edified_planks"); + public static final TagKey STAVES = create("staves"); + public static final TagKey PHIAL_BASE = create("phial_base"); + public static final TagKey GRANTS_ROOT_ADVANCEMENT = create("grants_root_advancement"); + + public static TagKey create(String name) { + return create(modLoc(name)); + } + + public static TagKey create(ResourceLocation id) { + return TagKey.create(Registry.ITEM_REGISTRY, id); + } + } + + public static final class Blocks { + public static final TagKey EDIFIED_LOGS = create("edified_logs"); + public static final TagKey EDIFIED_PLANKS = create("edified_planks"); + + public static TagKey create(String name) { + return TagKey.create(Registry.BLOCK_REGISTRY, modLoc(name)); + } + } + + public static final class Entities { + public static final TagKey> STICKY_TELEPORTERS = create("sticky_teleporters"); + public static final TagKey> CANNOT_TELEPORT = create("cannot_teleport"); + + public static TagKey> create(String name) { + return TagKey.create(Registry.ENTITY_TYPE_REGISTRY, modLoc(name)); + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/FlightAbility.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/FlightAbility.java new file mode 100644 index 00000000..55828a7e --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/FlightAbility.java @@ -0,0 +1,11 @@ +package at.petrak.hexcasting.api.player; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public record FlightAbility(boolean allowed, int timeLeft, ResourceKey dimension, Vec3 origin, double radius) { + public static FlightAbility deny() { + return new FlightAbility(false, 0, Level.OVERWORLD, Vec3.ZERO, 0); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/Sentinel.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/Sentinel.java new file mode 100644 index 00000000..f7cb6274 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/player/Sentinel.java @@ -0,0 +1,14 @@ +package at.petrak.hexcasting.api.player; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public record Sentinel(boolean hasSentinel, boolean extendsRange, Vec3 position, + ResourceKey dimension) { + public static Sentinel none() { + return new Sentinel(false, false, Vec3.ZERO, Level.OVERWORLD); + } + + +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/Action.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/Action.kt new file mode 100644 index 00000000..8f1095be --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/Action.kt @@ -0,0 +1,93 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.PatternRegistry +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.eval.SpellContinuation +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import at.petrak.hexcasting.api.utils.lightPurple +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.phys.Vec3 +import java.text.DecimalFormat + +/** + * Manipulates the stack in some way, usually by popping some number of values off the stack + * and pushing one new value. + * For a more "traditional" pop arguments, push return experience, see [ConstMediaAction]. + * + * Implementors MUST NOT mutate the context. + */ +interface Action { + /** + * Operate on the stack. Return the new stack and any side effects of the cast. + * + * Although this is passed a [MutableList], this is only for the convenience of implementors. + * It is a clone of the stack and modifying it does nothing. You must return the new stack + * with the [OperationResult]. + * + * A particle effect at the cast site and various messages and advancements are done automagically. + */ + fun operate( + continuation: SpellContinuation, + stack: MutableList, + ravenmind: Iota?, + ctx: CastingContext + ): OperationResult + + /** + * Do you need to be enlightened to use this operator? (i.e. is this operator a Great Pattern) + */ + val isGreat: Boolean get() = false + + /** + * Should this Great Pattern process and have side effects, even if its user isn't enlightened? + * + * The pattern itself may modify its effects based on whether the user is enlightened or not, regardless of what this value is. + */ + val alwaysProcessGreatSpell: Boolean get() = this is SpellAction + + /** + * Can this Great Pattern give you Blind Diversion? + */ + val causesBlindDiversion: Boolean get() = this is SpellAction + + /** + * The component for displaying this pattern's name. Override for dynamic patterns. + */ + val displayName: Component get() = "hexcasting.spell.${PatternRegistry.lookupPattern(this)}".asTranslatedComponent.lightPurple + + companion object { + // I see why vzakii did this: you can't raycast out to infinity! + const val MAX_DISTANCE: Double = 32.0 + const val MAX_DISTANCE_FROM_SENTINEL: Double = 16.0 + + @JvmStatic + fun raycastEnd(origin: Vec3, look: Vec3): Vec3 = + origin.add(look.normalize().scale(MAX_DISTANCE)) + + @JvmStatic + fun makeConstantOp(x: Iota): Action = object : ConstMediaAction { + override val argc: Int + get() = 0 + + override fun execute(args: List, ctx: CastingContext): List = + listOf(x) + } + + private val DOUBLE_FORMATTER = DecimalFormat("####.####") + + @JvmStatic + fun makeConstantOp(x: Double, key: ResourceLocation): Action = object : ConstMediaAction { + override val argc: Int + get() = 0 + + override fun execute(args: List, ctx: CastingContext): List = + x.asActionResult + + override val displayName: Component + get() = "hexcasting.spell.$key".asTranslatedComponent(DOUBLE_FORMATTER.format(x)).lightPurple + } + } +} + diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ConstMediaAction.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ConstMediaAction.kt new file mode 100644 index 00000000..1f721bc1 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ConstMediaAction.kt @@ -0,0 +1,36 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.eval.SpellContinuation +import at.petrak.hexcasting.api.spell.casting.sideeffects.OperatorSideEffect +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.mishaps.MishapNotEnoughArgs + +/** + * A SimpleOperator that always costs the same amount of media. + */ +interface ConstMediaAction : Action { + val argc: Int + val mediaCost: Int + get() = 0 + + fun execute(args: List, ctx: CastingContext): List + + override fun operate( + continuation: SpellContinuation, + stack: MutableList, + ravenmind: Iota?, + ctx: CastingContext + ): OperationResult { + if (this.argc > stack.size) + throw MishapNotEnoughArgs(this.argc, stack.size) + val args = stack.takeLast(this.argc) + repeat(this.argc) { stack.removeLast() } + val newData = this.execute(args, ctx) + stack.addAll(newData) + + val sideEffects = mutableListOf(OperatorSideEffect.ConsumeMedia(this.mediaCost)) + + return OperationResult(continuation, stack, ravenmind, sideEffects) + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperationResult.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperationResult.kt new file mode 100644 index 00000000..364a4fa3 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperationResult.kt @@ -0,0 +1,15 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.spell.casting.eval.SpellContinuation +import at.petrak.hexcasting.api.spell.casting.sideeffects.OperatorSideEffect +import at.petrak.hexcasting.api.spell.iota.Iota + +/** + * What happens when an operator is through? + */ +data class OperationResult( + val newContinuation: SpellContinuation, + val newStack: List, + val newRavenmind: Iota?, + val sideEffects: List +) diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperatorUtils.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperatorUtils.kt new file mode 100644 index 00000000..6389208f --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/OperatorUtils.kt @@ -0,0 +1,312 @@ +@file:JvmName("OperatorUtils") + +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.spell.iota.* +import at.petrak.hexcasting.api.spell.math.HexPattern +import at.petrak.hexcasting.api.spell.mishaps.MishapInvalidIota +import at.petrak.hexcasting.api.spell.mishaps.MishapNotEnoughArgs +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import com.mojang.datafixers.util.Either +import com.mojang.math.Vector3f +import net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.decoration.ArmorStand +import net.minecraft.world.entity.item.ItemEntity +import net.minecraft.world.entity.npc.Villager +import net.minecraft.world.phys.Vec3 +import java.util.function.DoubleUnaryOperator +import kotlin.math.abs +import kotlin.math.roundToInt +import kotlin.math.roundToLong + +fun List.getDouble(idx: Int, argc: Int = 0): Double { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + return x.double + } else { + // TODO: I'm not sure this calculation is correct + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "double") + } +} + +fun List.getEntity(idx: Int, argc: Int = 0): Entity { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is EntityIota) { + return x.entity + } else { + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "entity") + } +} + +fun List.getList(idx: Int, argc: Int = 0): SpellList { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is ListIota) { + return x.list + } else { + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "list") + } +} + +fun List.getPattern(idx: Int, argc: Int = 0): HexPattern { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is PatternIota) { + return x.pattern + } else { + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "pattern") + } +} + +fun List.getVec3(idx: Int, argc: Int = 0): Vec3 { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is Vec3Iota) { + return x.vec3 + } else { + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "vector") + } +} + +fun List.getBool(idx: Int, argc: Int = 0): Boolean { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is BooleanIota) { + return x.bool + } else { + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "boolean") + } +} + +// Helpers + +fun List.getItemEntity(idx: Int, argc: Int = 0): ItemEntity { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is EntityIota) { + val e = x.entity + if (e is ItemEntity) + return e + } + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "entity.item") +} + +fun List.getPlayer(idx: Int, argc: Int = 0): ServerPlayer { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is EntityIota) { + val e = x.entity + if (e is ServerPlayer) + return e + } + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "entity.player") +} + +fun List.getVillager(idx: Int, argc: Int = 0): Villager { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is EntityIota) { + val e = x.entity + if (e is Villager) + return e + } + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "entity.villager") +} + +fun List.getLivingEntityButNotArmorStand(idx: Int, argc: Int = 0): LivingEntity { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is EntityIota) { + val e = x.entity + if (e is LivingEntity && e !is ArmorStand) + return e + } + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "entity.living") +} + +fun List.getPositiveDouble(idx: Int, argc: Int = 0): Double { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + if (0 <= double) { + return double + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "double.positive") +} + +fun List.getPositiveDoubleUnder(idx: Int, max: Double, argc: Int = 0): Double { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + if (0.0 <= double && double < max) { + return double + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "double.positive.less", max) +} + +fun List.getPositiveDoubleUnderInclusive(idx: Int, max: Double, argc: Int = 0): Double { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + if (double in 0.0..max) { + return double + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "double.positive.less.equal", max) +} + +fun List.getDoubleBetween(idx: Int, min: Double, max: Double, argc: Int = 0): Double { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + if (double in min..max) { + return double + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "double.between", min, max) +} + +fun List.getInt(idx: Int, argc: Int = 0): Int { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + val rounded = double.roundToInt() + if (abs(double - rounded) <= DoubleIota.TOLERANCE) { + return rounded + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "int") +} + +fun List.getLong(idx: Int, argc: Int = 0): Long { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + val rounded = double.roundToLong() + if (abs(double - rounded) <= DoubleIota.TOLERANCE) { + return rounded + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "int") // shh we're lying +} + +fun List.getPositiveInt(idx: Int, argc: Int = 0): Int { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + val rounded = double.roundToInt() + if (abs(double - rounded) <= DoubleIota.TOLERANCE && rounded >= 0) { + return rounded + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "int.positive") +} + +fun List.getPositiveIntUnder(idx: Int, max: Int, argc: Int = 0): Int { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + val rounded = double.roundToInt() + if (abs(double - rounded) <= DoubleIota.TOLERANCE && rounded in 0 until max) { + return rounded + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "int.positive.less", max) +} + +fun List.getPositiveIntUnderInclusive(idx: Int, max: Int, argc: Int = 0): Int { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + val rounded = double.roundToInt() + if (abs(double - rounded) <= DoubleIota.TOLERANCE && rounded in 0 .. max) { + return rounded + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "int.positive.less.equal", max) +} + +fun List.getIntBetween(idx: Int, min: Int, max: Int, argc: Int = 0): Int { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is DoubleIota) { + val double = x.double + val rounded = double.roundToInt() + if (abs(double - rounded) <= DoubleIota.TOLERANCE && rounded in min..max) { + return rounded + } + } + throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "double.between", min, max) +} + +fun List.getBlockPos(idx: Int, argc: Int = 0): BlockPos { + val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (x is Vec3Iota) { + return BlockPos(x.vec3) + } + + throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "vector") +} + +fun List.getNumOrVec(idx: Int, argc: Int = 0): Either { + val datum = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + return when (datum) { + is DoubleIota -> Either.left(datum.double) + is Vec3Iota -> Either.right(datum.vec3) + else -> throw MishapInvalidIota.of( + datum, + if (argc == 0) idx else argc - (idx + 1), + "numvec" + ) + } +} + +fun List.getLongOrList(idx: Int, argc: Int = 0): Either { + val datum = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + if (datum is DoubleIota) { + val double = datum.double + val rounded = double.roundToLong() + if (abs(double - rounded) <= DoubleIota.TOLERANCE) { + return Either.left(rounded) + } + } else if (datum is ListIota) { + return Either.right(datum.list) + } + throw MishapInvalidIota.of( + datum, + if (argc == 0) idx else argc - (idx + 1), + "numlist" + ) +} + +fun evaluatable(datum: Iota, reverseIdx: Int): Either = + when (datum) { + is PatternIota -> Either.left(datum.pattern) + is ListIota -> Either.right(datum.list) + else -> throw MishapInvalidIota( + datum, + reverseIdx, + "hexcasting.mishap.invalid_value.evaluatable".asTranslatedComponent + ) + } + +fun Iota?.orNull() = this ?: NullIota() + +// TODO do we make this work on lists +// there should probably be some way to abstract function application over lists, vecs, and numbers, +// and i bet it's fucking monads +fun aplKinnie(operatee: Either, fn: DoubleUnaryOperator): Iota = + operatee.map( + { num -> DoubleIota(fn.applyAsDouble(num)) }, + { vec -> Vec3Iota(Vec3(fn.applyAsDouble(vec.x), fn.applyAsDouble(vec.y), fn.applyAsDouble(vec.z))) } + ) + +inline val Boolean.asActionResult get() = listOf(BooleanIota(this)) +inline val Double.asActionResult get() = listOf(DoubleIota(this)) +inline val Number.asActionResult get() = listOf(DoubleIota(this.toDouble())) + +inline val SpellList.asActionResult get() = listOf(ListIota(this)) +inline val List.asActionResult get() = listOf(ListIota(this)) + +inline val BlockPos.asActionResult get() = listOf(Vec3Iota(Vec3.atCenterOf(this))) +inline val Vector3f.asActionResult get() = listOf(Vec3Iota(Vec3(this))) +inline val Vec3.asActionResult get() = listOf(Vec3Iota(this)) + +inline val Entity?.asActionResult get() = listOf(if (this == null) NullIota() else EntityIota(this)) +inline val HexPattern.asActionResult get() = listOf(PatternIota(this)) diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ParticleSpray.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ParticleSpray.kt new file mode 100644 index 00000000..617ee5c0 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/ParticleSpray.kt @@ -0,0 +1,25 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.common.network.MsgCastParticleAck +import at.petrak.hexcasting.xplat.IXplatAbstractions +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.phys.Vec3 + +data class ParticleSpray(val pos: Vec3, val vel: Vec3, val fuzziness: Double, val spread: Double, val count: Int = 20) { + companion object { + @JvmStatic + fun burst(pos: Vec3, size: Double, count: Int = 20): ParticleSpray { + return ParticleSpray(pos, Vec3(size, 0.0, 0.0), 0.0, 3.14, count) + } + + @JvmStatic + fun cloud(pos: Vec3, size: Double, count: Int = 20): ParticleSpray { + return ParticleSpray(pos, Vec3(0.0, 0.001, 0.0), size, 0.0, count) + } + } + + fun sprayParticles(world: ServerLevel, color: FrozenColorizer) { + IXplatAbstractions.INSTANCE.sendPacketNear(this.pos, 128.0, world, MsgCastParticleAck(this, color)) + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/RenderedSpell.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/RenderedSpell.kt new file mode 100644 index 00000000..5929aa71 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/RenderedSpell.kt @@ -0,0 +1,7 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.spell.casting.CastingContext + +interface RenderedSpell { + fun cast(ctx: CastingContext) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellAction.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellAction.kt new file mode 100644 index 00000000..856c2b09 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellAction.kt @@ -0,0 +1,55 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.eval.SpellContinuation +import at.petrak.hexcasting.api.spell.casting.sideeffects.OperatorSideEffect +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.mishaps.MishapNotEnoughArgs + +interface SpellAction : Action { + val argc: Int + + fun hasCastingSound(ctx: CastingContext): Boolean = true + + fun awardsCastingStat(ctx: CastingContext): Boolean = true + + fun execute( + args: List, + ctx: CastingContext + ): Triple>? + + override fun operate( + continuation: SpellContinuation, + stack: MutableList, + ravenmind: Iota?, + ctx: CastingContext + ): OperationResult { + if (this.argc > stack.size) + throw MishapNotEnoughArgs(this.argc, stack.size) + val args = stack.takeLast(this.argc) + for (_i in 0 until this.argc) stack.removeLast() + val executeResult = this.execute(args, ctx) ?: return OperationResult(continuation, stack, ravenmind, listOf()) + val (spell, media, particles) = executeResult + + val sideEffects = mutableListOf() + + if (media > 0) + sideEffects.add(OperatorSideEffect.ConsumeMedia(media)) + + // Don't have an effect if the caster isn't enlightened, even if processing other side effects + if (!isGreat || ctx.isCasterEnlightened) + sideEffects.add( + OperatorSideEffect.AttemptSpell( + spell, + this.hasCastingSound(ctx), + this.awardsCastingStat(ctx) + ) + ) + + for (spray in particles) + sideEffects.add(OperatorSideEffect.Particles(spray)) + + return OperationResult(continuation, stack, ravenmind, sideEffects) + } + +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellList.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellList.kt new file mode 100644 index 00000000..c1472008 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/SpellList.kt @@ -0,0 +1,93 @@ +package at.petrak.hexcasting.api.spell + +import at.petrak.hexcasting.api.spell.iota.Iota + +/** + * Restricted interface for functional lists. + * + * ...Surely this won't have any performance implications. + */ +sealed class SpellList : Iterable { + + abstract val nonEmpty: Boolean + abstract val car: Iota + abstract val cdr: SpellList + + class LPair(override val car: Iota, override val cdr: SpellList) : SpellList() { + override val nonEmpty = true + } + + class LList(val idx: Int, val list: List) : SpellList() { + override val nonEmpty: Boolean + get() = idx < list.size + override val car: Iota + get() = list[idx] + override val cdr: SpellList + get() = LList(idx + 1, list) + + constructor(list: List) : this(0, list) + } + + fun modifyAt(startIdx: Int, modify: (SpellList) -> SpellList): SpellList { + val stack = mutableListOf() + val ptr = iterator() + var idx = startIdx + if (idx < 0) { + return this + } + while (idx > 0) { + if (!ptr.hasNext()) { + return this + } + idx-- + stack.add(ptr.next()) + } + var value = modify(ptr.list) + for (datum in stack.asReversed()) { + value = LPair(datum, value) + } + return value + } + + fun getAt(startIdx: Int): Iota { + var ptr = this + var idx = startIdx + if (idx < 0) { + throw ArrayIndexOutOfBoundsException() + } + while (idx > 0) { + when (ptr) { + is LPair -> ptr = ptr.cdr + is LList -> return ptr.list[ptr.idx + idx] + } + idx-- + } + return ptr.car + } + + override fun toString() = toList().toString() + + override fun iterator() = SpellListIterator(this) + + /** + * Note this is O(n), probably. + */ + fun size(): Int { + var size = 0 + var ptr = this + while (ptr.nonEmpty) { + ptr = ptr.cdr + size++ + } + return size + } + + class SpellListIterator(var list: SpellList) : Iterator { + override fun hasNext() = list.nonEmpty + override operator fun next(): Iota { + val car = list.car + list = list.cdr + return car + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt new file mode 100644 index 00000000..0ae90378 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingContext.kt @@ -0,0 +1,253 @@ +package at.petrak.hexcasting.api.spell.casting + +import at.petrak.hexcasting.api.HexAPI.modLoc +import at.petrak.hexcasting.api.misc.DiscoveryHandlers +import at.petrak.hexcasting.api.mod.HexConfig +import at.petrak.hexcasting.api.spell.Action +import at.petrak.hexcasting.api.spell.mishaps.MishapEntityTooFarAway +import at.petrak.hexcasting.api.spell.mishaps.MishapEvalTooDeep +import at.petrak.hexcasting.api.spell.mishaps.MishapLocationTooFarAway +import at.petrak.hexcasting.api.utils.otherHand +import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker +import at.petrak.hexcasting.xplat.IXplatAbstractions +import net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.InteractionHand +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.GameType +import net.minecraft.world.phys.Vec3 +import java.util.function.Predicate +import kotlin.math.min + +/** + * Transient info about the moment the spell started being cast. + */ +data class CastingContext( + val caster: ServerPlayer, + val castingHand: InteractionHand, + val source: CastSource, + val spellCircle: SpellCircleContext? = null +) { + constructor(caster: ServerPlayer, castingHand: InteractionHand, source: CastSource) : this( + caster, + castingHand, + source, + null + ) + + constructor(caster: ServerPlayer, castingHand: InteractionHand, spellCircleContext: SpellCircleContext) : + this(caster, castingHand, CastSource.SPELL_CIRCLE, spellCircleContext) + + private var depth: Int = 0 + + val world: ServerLevel get() = caster.getLevel() + val otherHand: InteractionHand get() = otherHand(this.castingHand) + val position: Vec3 get() = caster.position() + + private val entitiesGivenMotion = mutableSetOf() + + inline fun getHeldItemToOperateOn(acceptItemIf: (ItemStack) -> Boolean): Pair { + val handItem = caster.getItemInHand(otherHand) + if (!acceptItemIf(handItem)) { + val castingItem = caster.getItemInHand(castingHand) + if (acceptItemIf(castingItem)) { + return castingItem to castingHand + } + } + return handItem to otherHand + } + + /** + * Throws if we get too deep. + */ + fun incDepth() { + this.depth++ + val maxAllowedDepth = HexConfig.server().maxRecurseDepth() + if (this.depth > maxAllowedDepth) { + throw MishapEvalTooDeep() + } + } + + /** + * Check to make sure a vec is in world. + */ + fun assertVecInWorld(vec: Vec3) { + if (!isVecInWorld(vec)) + throw MishapLocationTooFarAway(vec, "out_of_world") + } + + /** + * Check to make sure a vec is in range. + */ + fun assertVecInRange(vec: Vec3) { + if (!isVecInRange(vec)) throw MishapLocationTooFarAway(vec) + assertVecInWorld(vec) + } + + fun assertVecInRange(pos: BlockPos) { + assertVecInRange(Vec3.atCenterOf(pos)) + } + + /** + * Check to make sure an entity is in range. Will not mishap for players. + */ + fun assertEntityInRange(entity: Entity) { + if (entity !is Player && !isEntityInRange(entity)) throw MishapEntityTooFarAway(entity) + } + + fun hasBeenGivenMotion(target: Entity): Boolean { + return entitiesGivenMotion.contains(target) + } + + fun isVecInWorld(vec: Vec3) = + world.isInWorldBounds(BlockPos(vec)) && world.worldBorder.isWithinBounds(vec.x, vec.z, 0.5) + + fun isVecInRange(vec: Vec3): Boolean { + val sentinel = IXplatAbstractions.INSTANCE.getSentinel(caster) + if (sentinel.hasSentinel + && sentinel.extendsRange + && world.dimension() == sentinel.dimension + && vec.distanceToSqr(sentinel.position) < Action.MAX_DISTANCE_FROM_SENTINEL * Action.MAX_DISTANCE_FROM_SENTINEL + ) + return true + + + if (this.spellCircle != null) { + // we use the eye position cause thats where the caster gets their "position" from + val range = this.caster.bbHeight + if (this.spellCircle.activatorAlwaysInRange && vec.distanceToSqr(this.caster.eyePosition) <= range * range) + return true + return this.spellCircle.aabb.contains(vec) + } + + return vec.distanceToSqr(this.caster.eyePosition) <= Action.MAX_DISTANCE * Action.MAX_DISTANCE + } + + fun isEntityInWorld(entity: Entity) = isVecInWorld(entity.position()) + + fun isEntityInRange(entity: Entity): Boolean { + if (this.spellCircle != null && this.spellCircle.activatorAlwaysInRange && this.caster == entity) + return true + return isVecInRange(entity.position()) + } + + fun canEditBlockAt(pos: BlockPos): Boolean { + return this.isVecInRange(Vec3.atCenterOf(pos)) + && this.caster.gameMode.gameModeForPlayer != GameType.ADVENTURE + && this.world.mayInteract(this.caster, pos) + } + + /** + * Return the slot from which to take blocks and items. + */ + // https://wiki.vg/Inventory is WRONG + // slots 0-8 are the hotbar + // for what purpose i cannot imagine + // http://redditpublic.com/images/b/b2/Items_slot_number.png looks right + // and offhand is 150 Inventory.java:464 + fun getOperativeSlot(stackOK: Predicate): ItemStack? { + val operable = DiscoveryHandlers.collectOperableSlots(this) + + for (stack in operable) { + if (stackOK.test(stack)) { + return stack + } + } + return null + } + + /** + * Remove the given count of the specified item from somewhere in the inventory, favoring slots not in the hotbar. + * Return whether the withdrawal was successful. + */ + // https://github.com/VazkiiMods/Psi/blob/master/src/main/java/vazkii/psi/common/spell/trick/block/PieceTrickPlaceBlock.java#L143 + fun withdrawItem(item: ItemStack, count: Int, actuallyRemove: Boolean): Boolean { + if (this.caster.isCreative) return true + + val operativeItem = item.copy() + + // TODO: withdraw from ender chest given a specific ender charm? + val stacksToExamine = DiscoveryHandlers.collectItemSlots(this) + + fun matches(stack: ItemStack): Boolean = + !stack.isEmpty && ItemStack.isSameItemSameTags(operativeItem, stack) + + val presentCount = stacksToExamine.fold(0) { acc, stack -> + acc + if (matches(stack)) stack.count else 0 + } + if (presentCount < count) return false + + // now that we know we have enough items, if we don't need to remove anything we're through. + if (!actuallyRemove) return true + + var remaining = count + for (stack in stacksToExamine) { + if (matches(stack)) { + val toWithdraw = min(stack.count, remaining) + stack.shrink(toWithdraw) + + remaining -= toWithdraw + if (remaining <= 0) { + return true + } + } + } + throw RuntimeException("unreachable") + } + + fun markEntityAsMotionAdded(entity: Entity) { + this.entitiesGivenMotion.add(entity) + } + + val canOvercast: Boolean + get() { + val adv = this.world.server.advancements.getAdvancement(modLoc("y_u_no_cast_angy")) + val advs = this.caster.advancements + return advs.getOrStartProgress(adv!!).isDone + } + + val isCasterEnlightened: Boolean + get() { + val adv = this.world.server.advancements.getAdvancement(modLoc("enlightenment")) + val advs = this.caster.advancements + return advs.getOrStartProgress(adv!!).isDone + } + + val debugPatterns: Boolean by lazy { + !DiscoveryHandlers.findDebugItem(this.caster, ItemCreativeUnlocker.DISPLAY_PATTERNS).isEmpty + } + + companion object { + init { + DiscoveryHandlers.addItemSlotDiscoverer { + val inv = it.caster.inventory + inv.items.toMutableList().apply { removeAt(inv.selected) }.asReversed().toMutableList().apply { + addAll(inv.offhand) + add(inv.getSelected()) + } + } + + DiscoveryHandlers.addOperativeSlotDiscoverer { + val slots = mutableListOf() + val anchorSlot = + if (it.castingHand == InteractionHand.MAIN_HAND) (it.caster.inventory.selected + 1) % 9 else 0 + + slots.add(it.caster.getItemInHand(it.otherHand)) + for (delta in 0 until 9) { + val slot = (anchorSlot + delta) % 9 + slots.add(it.caster.inventory.getItem(slot)) + } + slots + } + } + } + + enum class CastSource { + STAFF, + PACKAGED_HEX, + SPELL_CIRCLE, + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt new file mode 100644 index 00000000..780b6548 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt @@ -0,0 +1,689 @@ +package at.petrak.hexcasting.api.spell.casting + +import at.petrak.hexcasting.api.PatternRegistry +import at.petrak.hexcasting.api.advancements.HexAdvancementTriggers +import at.petrak.hexcasting.api.block.circle.BlockEntityAbstractImpetus +import at.petrak.hexcasting.api.misc.DiscoveryHandlers +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.misc.HexDamageSources +import at.petrak.hexcasting.api.mod.HexConfig +import at.petrak.hexcasting.api.mod.HexStatistics +import at.petrak.hexcasting.api.mod.HexTags +import at.petrak.hexcasting.api.spell.Action +import at.petrak.hexcasting.api.spell.ParticleSpray +import at.petrak.hexcasting.api.spell.SpellList +import at.petrak.hexcasting.api.spell.casting.eval.ContinuationFrame +import at.petrak.hexcasting.api.spell.casting.eval.FrameEvaluate +import at.petrak.hexcasting.api.spell.casting.eval.FunctionalData +import at.petrak.hexcasting.api.spell.casting.eval.SpellContinuation +import at.petrak.hexcasting.api.spell.casting.sideeffects.EvalSound +import at.petrak.hexcasting.api.spell.casting.sideeffects.OperatorSideEffect +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.ListIota +import at.petrak.hexcasting.api.spell.iota.PatternIota +import at.petrak.hexcasting.api.spell.math.HexDir +import at.petrak.hexcasting.api.spell.math.HexPattern +import at.petrak.hexcasting.api.spell.mishaps.* +import at.petrak.hexcasting.api.utils.* +import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes +import at.petrak.hexcasting.xplat.IXplatAbstractions +import net.minecraft.ChatFormatting +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.Tag +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundSource +import net.minecraft.util.Mth +import net.minecraft.world.level.gameevent.GameEvent +import net.minecraft.world.phys.Vec3 +import kotlin.math.max +import kotlin.math.min + +/** + * Keeps track of a player casting a spell on the server. + * It's stored as NBT on the wand. + */ +class CastingHarness private constructor( + var stack: MutableList, + var ravenmind: Iota?, + var parenCount: Int, + var parenthesized: List, + var escapeNext: Boolean, + val ctx: CastingContext, + val prepackagedColorizer: FrozenColorizer? // for trinkets with colorizers +) { + + @JvmOverloads + constructor( + ctx: CastingContext, + prepackagedColorizer: FrozenColorizer? = null + ) : this(mutableListOf(), null, 0, mutableListOf(), false, ctx, prepackagedColorizer) + + /** + * Execute a single iota. + */ + fun executeIota(iota: Iota, world: ServerLevel): ControllerInfo = executeIotas(listOf(iota), world) + + private fun displayPattern(escapeNext: Boolean, parenCount: Int, iotaRepresentation: Component) { + if (this.ctx.debugPatterns) { + val display = " ".repeat(parenCount).asTextComponent + if (escapeNext) + display.append("\\ ".asTextComponent.gold) + display.append(iotaRepresentation) + + this.ctx.caster.sendSystemMessage(display) + } + } + + private fun getOperatorForPattern(iota: Iota, world: ServerLevel): Action? { + if (iota is PatternIota) + return PatternRegistry.matchPattern(iota.pattern, world) + return null + } + + private fun getPatternForFrame(frame: ContinuationFrame): HexPattern? { + if (frame !is FrameEvaluate) return null + + return (frame.list.car as? PatternIota)?.pattern + } + + private fun getOperatorForFrame(frame: ContinuationFrame, world: ServerLevel): Action? { + if (frame !is FrameEvaluate) return null + + return getOperatorForPattern(frame.list.car, world) + } + + /** + * Given a list of iotas, execute them in sequence. + */ + fun executeIotas(iotas: List, world: ServerLevel): ControllerInfo { + // Initialize the continuation stack to a single top-level eval for all iotas. + var continuation = SpellContinuation.Done.pushFrame(FrameEvaluate(SpellList.LList(0, iotas), false)) + // Begin aggregating info + val info = TempControllerInfo(earlyExit = false) + var lastResolutionType = ResolvedPatternType.UNRESOLVED + var sound = HexEvalSounds.NOTHING + while (continuation is SpellContinuation.NotDone && !info.earlyExit) { + // Take the top of the continuation stack... + val next = continuation.frame + // ...and execute it. + val result = try { + next.evaluate(continuation.next, world, this) + } catch (mishap: Mishap) { + val pattern = getPatternForFrame(next) + val operator = try { + getOperatorForFrame(next, world) + } catch (e: Throwable) { + null + } + CastResult( + continuation, + null, + mishap.resolutionType(ctx), + listOf( + OperatorSideEffect.DoMishap( + mishap, + Mishap.Context(pattern ?: HexPattern(HexDir.WEST), operator) + ) + ), + HexEvalSounds.MISHAP, + ) + } + // Then write all pertinent data back to the harness for the next iteration. + if (result.newData != null) { + this.applyFunctionalData(result.newData) + } + continuation = result.continuation + lastResolutionType = result.resolutionType + performSideEffects(info, result.sideEffects) + info.earlyExit = info.earlyExit || !lastResolutionType.success + sound = if (result.sound == HexEvalSounds.MISHAP) { + HexEvalSounds.MISHAP + } else { + sound.greaterOf(result.sound) + } + } + + sound.sound?.let { + this.ctx.world.playSound( + null, this.ctx.position.x, this.ctx.position.y, this.ctx.position.z, it, + SoundSource.PLAYERS, 1f, 1f + ) + // TODO: is it worth mixing in to the immut map and making our own game event with blackjack and hookers + this.ctx.world.gameEvent(this.ctx.caster, GameEvent.ITEM_INTERACT_FINISH, this.ctx.position) + } + + if (continuation is SpellContinuation.NotDone) { + lastResolutionType = + if (lastResolutionType.success) ResolvedPatternType.EVALUATED else ResolvedPatternType.ERRORED + } + + val (stackDescs, parenDescs, ravenmind) = generateDescs() + + return ControllerInfo( + this.stack.isEmpty() && this.parenCount == 0 && !this.escapeNext, + lastResolutionType, + stackDescs, + parenDescs, + ravenmind, + this.parenCount + ) + } + + fun getUpdate(iota: Iota, world: ServerLevel, continuation: SpellContinuation): CastResult { + try { + // TODO we can have a special intro/retro sound + this.handleParentheses(iota)?.let { (data, resolutionType) -> + return@getUpdate CastResult(continuation, data, resolutionType, listOf(), HexEvalSounds.OPERATOR) + } + + if (iota is PatternIota) { + return updateWithPattern(iota.pattern, world, continuation) + } else { + return CastResult( + continuation, + null, + ResolvedPatternType.INVALID, // Should never matter + listOf( + OperatorSideEffect.DoMishap( + MishapUnescapedValue(iota), + Mishap.Context(HexPattern(HexDir.WEST), null) + ) + ), + HexEvalSounds.MISHAP + ) + } + } catch (mishap: Mishap) { + val operator = try { + getOperatorForPattern(iota, world) + } catch (e: Throwable) { + null + } + return CastResult( + continuation, + null, + mishap.resolutionType(ctx), + listOf( + OperatorSideEffect.DoMishap( + mishap, + Mishap.Context( + (iota as? PatternIota)?.pattern ?: HexPattern(HexDir.WEST), + operator + ) + ) + ), + HexEvalSounds.MISHAP + ) + } catch (exception: Exception) { + // This means something very bad has happened + exception.printStackTrace() + val operator = try { + getOperatorForPattern(iota, world) + } catch (e: Throwable) { + null + } + return CastResult( + continuation, + null, + ResolvedPatternType.ERRORED, + listOf( + OperatorSideEffect.DoMishap( + MishapError(exception), + Mishap.Context( + (iota as? PatternIota)?.pattern ?: HexPattern(HexDir.WEST), + operator + ) + ) + ), + HexEvalSounds.MISHAP + ) + } + } + + /** + * When the server gets a packet from the client with a new pattern, + * handle it functionally. + */ + fun updateWithPattern(newPat: HexPattern, world: ServerLevel, continuation: SpellContinuation): CastResult { + var actionIdPair: Pair? = null + try { + // Don't catch this one + val mojangPair = PatternRegistry.matchPatternAndID(newPat, world) + actionIdPair = mojangPair.first to mojangPair.second + + if (this.ctx.spellCircle == null && !HexConfig.server().isActionAllowed(actionIdPair.second)) { + throw MishapDisallowedSpell() + } else if (this.ctx.spellCircle != null + && !HexConfig.server().isActionAllowedInCircles(actionIdPair.second) + ) { + throw MishapDisallowedSpell("disallowed_circle") + } + + val pattern = actionIdPair.first + + val unenlightened = pattern.isGreat && !ctx.isCasterEnlightened + + val sideEffects = mutableListOf() + var stack2: List? = null + var cont2 = continuation + var ravenmind2: Iota? = null + + if (!unenlightened || pattern.alwaysProcessGreatSpell) { + displayPattern(false, 0, pattern.displayName) + val result = pattern.operate( + continuation, + this.stack.toMutableList(), + this.ravenmind, + this.ctx + ) + cont2 = result.newContinuation + stack2 = result.newStack + ravenmind2 = result.newRavenmind + // TODO parens also break prescience + sideEffects.addAll(result.sideEffects) + } + + if (unenlightened) { + sideEffects.add(OperatorSideEffect.RequiredEnlightenment(pattern.causesBlindDiversion)) + } + + // Stick a poofy particle effect at the caster position + if (this.ctx.spellCircle == null) + sideEffects.add( + OperatorSideEffect.Particles( + ParticleSpray( + this.ctx.position, + Vec3(0.0, 1.0, 0.0), + 0.5, 1.0 + ) + ) + ) + + val hereFd = this.getFunctionalData() + val fd = if (stack2 != null) { + hereFd.copy( + stack = stack2, + ravenmind = ravenmind2 + ) + } else { + hereFd + } + + var soundType = if (this.ctx.source == CastingContext.CastSource.STAFF) { + HexEvalSounds.OPERATOR + } else { + HexEvalSounds.NOTHING + } + for (se in sideEffects) { + if (se is OperatorSideEffect.AttemptSpell) { + soundType = if (se.hasCastingSound) { + soundType.greaterOf(HexEvalSounds.SPELL) + } else { + // WITH CATLIKE TREAD + // UPON OUR PREY WE STEAL + HexEvalSounds.NOTHING + } + } else if (se is OperatorSideEffect.DoMishap) { + soundType = HexEvalSounds.MISHAP + } + } + return CastResult( + cont2, + fd, + ResolvedPatternType.EVALUATED, + sideEffects, + soundType, + ) + + } catch (mishap: Mishap) { + return CastResult( + continuation, + null, + mishap.resolutionType(ctx), + listOf(OperatorSideEffect.DoMishap(mishap, Mishap.Context(newPat, actionIdPair?.first))), + HexEvalSounds.MISHAP + ) + } + } + + /** + * Execute the side effects of a pattern, updating our aggregated info. + */ + fun performSideEffects(info: TempControllerInfo, sideEffects: List) { + for (haskellProgrammersShakingandCryingRN in sideEffects) { + val mustStop = haskellProgrammersShakingandCryingRN.performEffect(this) + if (mustStop) { + info.earlyExit = true + break + } + } + } + + fun generateDescs() = Triple( + stack.map(HexIotaTypes::serialize), + parenthesized.map(HexIotaTypes::serialize), + ravenmind?.let(HexIotaTypes::serialize) + ) + + /** + * Return the functional update represented by the current state (for use with `copy`) + */ + fun getFunctionalData() = FunctionalData( + this.stack.toList(), + this.parenCount, + this.parenthesized.toList(), + this.escapeNext, + this.ravenmind, + ) + + /** + * Apply the functional update. + */ + fun applyFunctionalData(data: FunctionalData) { + this.stack.clear() + this.stack.addAll(data.stack) + this.parenCount = data.parenCount + this.parenthesized = data.parenthesized + this.escapeNext = data.escapeNext + this.ravenmind = data.ravenmind + } + + /** + * Return a non-null value if we handled this in some sort of parenthesey way, + * either escaping it onto the stack or changing the parenthese-handling state. + */ + private fun handleParentheses(iota: Iota): Pair? { + val sig = (iota as? PatternIota)?.pattern?.anglesSignature() + + var displayDepth = this.parenCount + + val out = if (this.parenCount > 0) { + if (this.escapeNext) { + val newParens = this.parenthesized.toMutableList() + newParens.add(iota) + this.getFunctionalData().copy( + escapeNext = false, + parenthesized = newParens + ) to ResolvedPatternType.ESCAPED + } else { + + when (sig) { + SpecialPatterns.CONSIDERATION.anglesSignature() -> { + this.getFunctionalData().copy( + escapeNext = true, + ) to ResolvedPatternType.EVALUATED + } + + SpecialPatterns.INTROSPECTION.anglesSignature() -> { + // we have escaped the parens onto the stack; we just also record our count. + val newParens = this.parenthesized.toMutableList() + newParens.add(iota) + this.getFunctionalData().copy( + parenthesized = newParens, + parenCount = this.parenCount + 1 + ) to if (this.parenCount == 0) ResolvedPatternType.EVALUATED else ResolvedPatternType.ESCAPED + } + + SpecialPatterns.RETROSPECTION.anglesSignature() -> { + val newParenCount = this.parenCount - 1 + displayDepth-- + if (newParenCount == 0) { + val newStack = this.stack.toMutableList() + newStack.add(ListIota(this.parenthesized.toList())) + this.getFunctionalData().copy( + stack = newStack, + parenCount = newParenCount, + parenthesized = listOf() + ) to ResolvedPatternType.EVALUATED + } else if (newParenCount < 0) { + throw MishapTooManyCloseParens() + } else { + // we have this situation: "(()" + // we need to add the close paren + val newParens = this.parenthesized.toMutableList() + newParens.add(iota) + this.getFunctionalData().copy( + parenCount = newParenCount, + parenthesized = newParens + ) to ResolvedPatternType.ESCAPED + } + } + + else -> { + val newParens = this.parenthesized.toMutableList() + newParens.add(iota) + this.getFunctionalData().copy( + parenthesized = newParens + ) to ResolvedPatternType.ESCAPED + } + } + } + } else if (this.escapeNext) { + val newStack = this.stack.toMutableList() + newStack.add(iota) + this.getFunctionalData().copy( + stack = newStack, + escapeNext = false, + ) to ResolvedPatternType.ESCAPED + } else { + when (sig) { + SpecialPatterns.CONSIDERATION.anglesSignature() -> { + this.getFunctionalData().copy( + escapeNext = true + ) to ResolvedPatternType.EVALUATED + } + + SpecialPatterns.INTROSPECTION.anglesSignature() -> { + this.getFunctionalData().copy( + parenCount = this.parenCount + 1 + ) to ResolvedPatternType.EVALUATED + } + + SpecialPatterns.RETROSPECTION.anglesSignature() -> { + throw MishapTooManyCloseParens() + } + + else -> { + null + } + } + } + + if (out != null) { + val display = if (iota is PatternIota) { + PatternNameHelper.representationForPattern(iota.pattern) + .copy() + .withStyle(if (out.second == ResolvedPatternType.ESCAPED) ChatFormatting.YELLOW else ChatFormatting.AQUA) + } else iota.display() + displayPattern(this.escapeNext, displayDepth, display) + } + return out + } + + /** + * Might cast from hitpoints. + * Returns the media cost still remaining after we deplete everything. It will be <= 0 if we could pay for it. + * + * Also awards stats and achievements and such + */ + fun withdrawMedia(mediaCost: Int, allowOvercast: Boolean): Int { + // prevent poor impls from gaining you media + if (mediaCost <= 0) return 0 + var costLeft = mediaCost + + val fake = this.ctx.caster.isCreative + + if (this.ctx.spellCircle != null) { + if (fake) + return 0 + + val tile = this.ctx.world.getBlockEntity(this.ctx.spellCircle.impetusPos) + if (tile is BlockEntityAbstractImpetus) { + val mediaAvailable = tile.media + if (mediaAvailable < 0) + return 0 + + val mediaToTake = min(costLeft, mediaAvailable) + costLeft -= mediaToTake + tile.media = mediaAvailable - mediaToTake + } + } else { + val casterStack = this.ctx.caster.getItemInHand(this.ctx.castingHand) + val casterMediaHolder = IXplatAbstractions.INSTANCE.findMediaHolder(casterStack) + val casterHexHolder = IXplatAbstractions.INSTANCE.findHexHolder(casterStack) + val hexHolderDrawsFromInventory = if (casterHexHolder != null) { + if (casterMediaHolder != null) { + val mediaAvailable = casterMediaHolder.withdrawMedia(-1, true) + val mediaToTake = min(costLeft, mediaAvailable) + if (!fake) casterMediaHolder.withdrawMedia(mediaToTake, false) + costLeft -= mediaToTake + } + casterHexHolder.canDrawMediaFromInventory() + } else { + false + } + + if (casterStack.`is`(HexTags.Items.STAVES) || hexHolderDrawsFromInventory) { + val mediaSources = DiscoveryHandlers.collectMediaHolders(this) + .sortedWith(Comparator(::compareMediaItem).reversed()) + for (source in mediaSources) { + costLeft -= extractMedia(source, costLeft, simulate = fake) + if (costLeft <= 0) + break + } + + if (allowOvercast && costLeft > 0) { + // Cast from HP! + val mediaToHealth = HexConfig.common().mediaToHealthRate() + val healthToRemove = max(costLeft.toDouble() / mediaToHealth, 0.5) + val mediaAbleToCastFromHP = this.ctx.caster.health * mediaToHealth + + val mediaToActuallyPayFor = min(mediaAbleToCastFromHP.toInt(), costLeft) + costLeft -= if (!fake) { + Mishap.trulyHurt(this.ctx.caster, HexDamageSources.OVERCAST, healthToRemove.toFloat()) + + val actuallyTaken = Mth.ceil(mediaAbleToCastFromHP - (this.ctx.caster.health * mediaToHealth)) + + HexAdvancementTriggers.OVERCAST_TRIGGER.trigger(this.ctx.caster, actuallyTaken) + this.ctx.caster.awardStat(HexStatistics.MEDIA_OVERCAST, mediaCost - costLeft) + actuallyTaken + } else { + mediaToActuallyPayFor + } + } + } + } + + if (!fake) { + // this might be more than the media cost! for example if we waste a lot of media from an item + this.ctx.caster.awardStat(HexStatistics.MEDIA_USED, mediaCost - costLeft) + HexAdvancementTriggers.SPEND_MEDIA_TRIGGER.trigger( + this.ctx.caster, + mediaCost - costLeft, + if (costLeft < 0) -costLeft else 0 + ) + } + + return if (fake) 0 else costLeft + } + + fun getColorizer(): FrozenColorizer { + if (this.prepackagedColorizer != null) + return this.prepackagedColorizer + + return IXplatAbstractions.INSTANCE.getColorizer(this.ctx.caster) + } + + + fun serializeToNBT() = NBTBuilder { + TAG_STACK %= stack.serializeToNBT() + + if (ravenmind != null) + TAG_LOCAL %= HexIotaTypes.serialize(ravenmind!!) + TAG_PAREN_COUNT %= parenCount + TAG_ESCAPE_NEXT %= escapeNext + + TAG_PARENTHESIZED %= parenthesized.serializeToNBT() + + if (prepackagedColorizer != null) + TAG_PREPACKAGED_COLORIZER %= prepackagedColorizer.serializeToNBT() + } + + + companion object { + const val TAG_STACK = "stack" + const val TAG_LOCAL = "local" + const val TAG_PAREN_COUNT = "open_parens" + const val TAG_PARENTHESIZED = "parenthesized" + const val TAG_ESCAPE_NEXT = "escape_next" + const val TAG_PREPACKAGED_COLORIZER = "prepackaged_colorizer" + + init { + DiscoveryHandlers.addMediaHolderDiscoverer { + it.ctx.caster.inventory.items + .filter(::isMediaItem) + .mapNotNull(IXplatAbstractions.INSTANCE::findMediaHolder) + } + DiscoveryHandlers.addMediaHolderDiscoverer { + it.ctx.caster.inventory.armor + .filter(::isMediaItem) + .mapNotNull(IXplatAbstractions.INSTANCE::findMediaHolder) + } + DiscoveryHandlers.addMediaHolderDiscoverer { + it.ctx.caster.inventory.offhand + .filter(::isMediaItem) + .mapNotNull(IXplatAbstractions.INSTANCE::findMediaHolder) + } + } + + @JvmStatic + fun fromNBT(nbt: CompoundTag, ctx: CastingContext): CastingHarness { + return try { + val stack = mutableListOf() + val stackTag = nbt.getList(TAG_STACK, Tag.TAG_COMPOUND) + for (subtag in stackTag) { + val datum = HexIotaTypes.deserialize(subtag.asCompound, ctx.world) + stack.add(datum) + } + + val ravenmind = if (nbt.contains(TAG_LOCAL)) + HexIotaTypes.deserialize(nbt.getCompound(TAG_LOCAL), ctx.world) + else + null + + val parenthesized = mutableListOf() + val parenTag = nbt.getList(TAG_PARENTHESIZED, Tag.TAG_COMPOUND) + for (subtag in parenTag) { + parenthesized.add(HexIotaTypes.deserialize(subtag.downcast(CompoundTag.TYPE), ctx.world)) + } + + val parenCount = nbt.getInt(TAG_PAREN_COUNT) + val escapeNext = nbt.getBoolean(TAG_ESCAPE_NEXT) + + val colorizer = if (nbt.contains(TAG_PREPACKAGED_COLORIZER)) { + FrozenColorizer.fromNBT(nbt.getCompound(TAG_PREPACKAGED_COLORIZER)) + } else { + null + } + + CastingHarness(stack, ravenmind, parenCount, parenthesized, escapeNext, ctx, colorizer) + } catch (exn: Exception) { + CastingHarness(ctx) + } + } + } + + data class TempControllerInfo( + var earlyExit: Boolean, + ) + + data class CastResult( + val continuation: SpellContinuation, + val newData: FunctionalData?, + val resolutionType: ResolvedPatternType, + val sideEffects: List, + val sound: EvalSound, + ) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt new file mode 100644 index 00000000..64d60aba --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ControllerInfo.kt @@ -0,0 +1,16 @@ +package at.petrak.hexcasting.api.spell.casting + +import net.minecraft.nbt.CompoundTag + +/** + * Information for the sake of the GUI. + */ +data class ControllerInfo( + val isStackClear: Boolean, + val resolutionType: ResolvedPatternType, + val stack: List, + val parenthesized: List, + val ravenmind: CompoundTag?, + val parenCount: Int, +) + diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPattern.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPattern.kt new file mode 100644 index 00000000..0413f64c --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPattern.kt @@ -0,0 +1,27 @@ +package at.petrak.hexcasting.api.spell.casting + +import at.petrak.hexcasting.api.spell.math.HexCoord +import at.petrak.hexcasting.api.spell.math.HexPattern +import at.petrak.hexcasting.api.utils.NBTBuilder +import net.minecraft.nbt.CompoundTag +import java.util.* + + +data class ResolvedPattern(val pattern: HexPattern, val origin: HexCoord, var type: ResolvedPatternType) { + fun serializeToNBT() = NBTBuilder { + "Pattern" %= pattern.serializeToNBT() + "OriginQ" %= origin.q + "OriginR" %= origin.r + "Valid" %= type.name.lowercase(Locale.ROOT) + } + + companion object { + @JvmStatic + fun fromNBT(tag: CompoundTag): ResolvedPattern { + val pattern = HexPattern.fromNBT(tag.getCompound("Pattern")) + val origin = HexCoord(tag.getInt("OriginQ"), tag.getInt("OriginR")) + val valid = ResolvedPatternType.fromString(tag.getString("Valid")) + return ResolvedPattern(pattern, origin, valid) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPatternType.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPatternType.kt new file mode 100644 index 00000000..518f3cec --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/ResolvedPatternType.kt @@ -0,0 +1,18 @@ +package at.petrak.hexcasting.api.spell.casting + +import at.petrak.hexcasting.api.utils.getSafe + +enum class ResolvedPatternType(val color: Int, val fadeColor: Int, val success: Boolean) { + UNRESOLVED(0x7f7f7f, 0xcccccc, false), + EVALUATED(0x7385de, 0xfecbe6, true), + ESCAPED(0xddcc73, 0xfffae5, true), + ERRORED(0xde6262, 0xffc7a0, false), + INVALID(0xb26b6b, 0xcca88e, false); + + companion object { + @JvmStatic + fun fromString(key: String): ResolvedPatternType { + return values().getSafe(key) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpecialPatterns.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpecialPatterns.java new file mode 100644 index 00000000..e784b87a --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpecialPatterns.java @@ -0,0 +1,10 @@ +package at.petrak.hexcasting.api.spell.casting; + +import at.petrak.hexcasting.api.spell.math.HexDir; +import at.petrak.hexcasting.api.spell.math.HexPattern; + +public final class SpecialPatterns { + public static final HexPattern INTROSPECTION = HexPattern.fromAngles("qqq", HexDir.WEST); + public static final HexPattern RETROSPECTION = HexPattern.fromAngles("eee", HexDir.EAST); + public static final HexPattern CONSIDERATION = HexPattern.fromAngles("qqqaw", HexDir.EAST); +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpellCircleContext.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpellCircleContext.kt new file mode 100644 index 00000000..404575f2 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/SpellCircleContext.kt @@ -0,0 +1,56 @@ +package at.petrak.hexcasting.api.spell.casting + +import at.petrak.hexcasting.api.utils.NBTBuilder +import net.minecraft.core.BlockPos +import net.minecraft.nbt.CompoundTag +import net.minecraft.world.phys.AABB + +/** + * Optional field on a [CastingContext] for the spell circle + */ +data class SpellCircleContext(val impetusPos: BlockPos, val aabb: AABB, val activatorAlwaysInRange: Boolean) { + fun serializeToNBT() = NBTBuilder { + TAG_IMPETUS_X %= impetusPos.x + TAG_IMPETUS_Y %= impetusPos.y + TAG_IMPETUS_Z %= impetusPos.z + + TAG_MIN_X %= aabb.minX + TAG_MIN_Y %= aabb.minY + TAG_MIN_Z %= aabb.minZ + TAG_MAX_X %= aabb.maxX + TAG_MAX_Y %= aabb.maxY + TAG_MAX_Z %= aabb.maxZ + + TAG_PLAYER_ALWAYS_IN_RANGE %= activatorAlwaysInRange + } + + companion object { + const val TAG_IMPETUS_X = "impetus_x" + const val TAG_IMPETUS_Y = "impetus_y" + const val TAG_IMPETUS_Z = "impetus_z" + const val TAG_MIN_X = "min_x" + const val TAG_MIN_Y = "min_y" + const val TAG_MIN_Z = "min_z" + const val TAG_MAX_X = "max_x" + const val TAG_MAX_Y = "max_y" + const val TAG_MAX_Z = "max_z" + const val TAG_PLAYER_ALWAYS_IN_RANGE = "player_always_in_range" + + fun fromNBT(tag: CompoundTag): SpellCircleContext { + val impX = tag.getInt(TAG_IMPETUS_X) + val impY = tag.getInt(TAG_IMPETUS_Y) + val impZ = tag.getInt(TAG_IMPETUS_Z) + + val minX = tag.getDouble(TAG_MIN_X) + val minY = tag.getDouble(TAG_MIN_Y) + val minZ = tag.getDouble(TAG_MIN_Z) + val maxX = tag.getDouble(TAG_MAX_X) + val maxY = tag.getDouble(TAG_MAX_Y) + val maxZ = tag.getDouble(TAG_MAX_Z) + + val playerAIR = tag.getBoolean(TAG_PLAYER_ALWAYS_IN_RANGE) + + return SpellCircleContext(BlockPos(impX, impY, impZ), AABB(minX, minY, minZ, maxX, maxY, maxZ), playerAIR) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/ContinuationFrame.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/ContinuationFrame.kt new file mode 100644 index 00000000..4d768732 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/ContinuationFrame.kt @@ -0,0 +1,78 @@ +package at.petrak.hexcasting.api.spell.casting.eval + +import at.petrak.hexcasting.api.spell.SpellList +import at.petrak.hexcasting.api.spell.casting.CastingHarness +import at.petrak.hexcasting.api.spell.casting.CastingHarness.CastResult +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.utils.getList +import at.petrak.hexcasting.api.utils.hasList +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.Tag +import net.minecraft.server.level.ServerLevel + +// TODO this should probably be a registry too +/** + * A single frame of evaluation during the execution of a spell. + * + * Specifically, an evaluation will keep a stack of these frames. + * An evaluation with no meta-eval will consist of a single [Evaluate(rest of the pats)] at all times. + * When an Eval is invoked, we push Evaluate(pats) to the top of the stack. + * + * Evaluation is performed by repeatedly popping the top-most (i.e. innermost) frame from the stack, + * then evaluating that frame (and possibly allowing it to push other frames (e.g. if it's a Hermes)). + * + * Once the stack of frames is empty, there are no more computations to run, so we're done. + * + */ +sealed interface ContinuationFrame { + /** + * Step the evaluation forward once. + * For Evaluate, this consumes one pattern; for ForEach this queues the next iteration of the outer loop. + * @return the result of this pattern step + */ + fun evaluate(continuation: SpellContinuation, level: ServerLevel, harness: CastingHarness): CastResult + + /** + * The OpHalt instruction wants us to "jump to" the END of the nearest meta-eval. + * In other words, we should consume Evaluate frames until we hit a FinishEval or Thoth frame. + * @return whether the break should stop here, alongside the new stack state (e.g. for finalizing a Thoth) + */ + fun breakDownwards(stack: List): Pair> + + /** + * Serializes this frame. Used for things like delays, where we pause execution. + */ + fun serializeToNBT(): CompoundTag + + companion object { + @JvmStatic + fun fromNBT(tag: CompoundTag, world: ServerLevel): ContinuationFrame { + return when (tag.getString("type")) { + "eval" -> FrameEvaluate( + HexIotaTypes.LIST.deserialize( + tag.getList("patterns", Tag.TAG_COMPOUND), + world + )!!.list, + tag.getBoolean("isMetacasting") + ) + + "end" -> FrameFinishEval + "foreach" -> FrameForEach( + HexIotaTypes.LIST.deserialize(tag.getList("data", Tag.TAG_COMPOUND), world)!!.list, + HexIotaTypes.LIST.deserialize(tag.getList("code", Tag.TAG_COMPOUND), world)!!.list, + if (tag.hasList("base", Tag.TAG_COMPOUND)) + HexIotaTypes.LIST.deserialize(tag.getList("base", Tag.TAG_COMPOUND), world)!!.list.toList() + else + null, + HexIotaTypes.LIST.deserialize( + tag.getList("accumulator", Tag.TAG_COMPOUND), + world + )!!.list.toMutableList() + ) + + else -> FrameEvaluate(SpellList.LList(0, listOf()), false) + } + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameEvaluate.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameEvaluate.kt new file mode 100644 index 00000000..f8052f2d --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameEvaluate.kt @@ -0,0 +1,51 @@ +package at.petrak.hexcasting.api.spell.casting.eval + +import at.petrak.hexcasting.api.spell.SpellList +import at.petrak.hexcasting.api.spell.casting.CastingHarness +import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.utils.NBTBuilder +import at.petrak.hexcasting.api.utils.serializeToNBT +import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import net.minecraft.server.level.ServerLevel + +/** + * A list of patterns to be evaluated in sequence. + * @property list the *remaining* list of patterns to be evaluated + * @property isMetacasting only for sound effects, if this is being cast from a hermes / iris + */ +data class FrameEvaluate(val list: SpellList, val isMetacasting: Boolean) : ContinuationFrame { + // Discard this frame and keep discarding frames. + override fun breakDownwards(stack: List) = false to stack + + // Step the list of patterns, evaluating a single one. + override fun evaluate( + continuation: SpellContinuation, + level: ServerLevel, + harness: CastingHarness + ): CastingHarness.CastResult { + // If there are patterns left... + return if (list.nonEmpty) { + val newCont = if (list.cdr.nonEmpty) { // yay TCO + // ...enqueue the evaluation of the rest of the patterns... + continuation.pushFrame(FrameEvaluate(list.cdr, this.isMetacasting)) + } else continuation + // ...before evaluating the first one in the list. + val update = harness.getUpdate(list.car, level, newCont) + if (this.isMetacasting && update.sound != HexEvalSounds.MISHAP) { + update.copy(sound = HexEvalSounds.HERMES) + } else { + update + } + } else { + // If there are no patterns (e.g. empty Hermes), just return OK. + CastingHarness.CastResult(continuation, null, ResolvedPatternType.EVALUATED, listOf(), HexEvalSounds.HERMES) + } + } + + override fun serializeToNBT() = NBTBuilder { + "type" %= "evaluate" + "patterns" %= list.serializeToNBT() + "isMetacasting" %= isMetacasting + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameFinishEval.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameFinishEval.kt new file mode 100644 index 00000000..05ec820b --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameFinishEval.kt @@ -0,0 +1,36 @@ +package at.petrak.hexcasting.api.spell.casting.eval + +import at.petrak.hexcasting.api.spell.casting.CastingHarness +import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.utils.NBTBuilder +import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import net.minecraft.server.level.ServerLevel + +/** + * A stack marker representing the end of a Hermes evaluation, + * so that we know when to stop removing frames during a Halt. + */ +object FrameFinishEval : ContinuationFrame { + // Don't do anything else to the stack, just finish the halt statement. + override fun breakDownwards(stack: List) = true to stack + + // Evaluating it does nothing; it's only a boundary condition. + override fun evaluate( + continuation: SpellContinuation, + level: ServerLevel, + harness: CastingHarness + ): CastingHarness.CastResult { + return CastingHarness.CastResult( + continuation, + FunctionalData(harness.stack.toList(), 0, listOf(), false, harness.ravenmind), + ResolvedPatternType.EVALUATED, + listOf(), + HexEvalSounds.NOTHING, + ) + } + + override fun serializeToNBT() = NBTBuilder { + "type" %= "end" + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameForEach.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameForEach.kt new file mode 100644 index 00000000..40107399 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FrameForEach.kt @@ -0,0 +1,87 @@ +package at.petrak.hexcasting.api.spell.casting.eval + +import at.petrak.hexcasting.api.spell.SpellList +import at.petrak.hexcasting.api.spell.casting.CastingHarness +import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.ListIota +import at.petrak.hexcasting.api.utils.NBTBuilder +import at.petrak.hexcasting.api.utils.serializeToNBT +import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import net.minecraft.server.level.ServerLevel + +/** + * A frame representing all the state for a Thoth evaluation. + * Pushed by an OpForEach. + * @property first whether the input stack state is the first one (since we don't want to save the base-stack before any changes are made) + * @property data list of *remaining* datums to ForEach over + * @property code code to run per datum + * @property baseStack the stack state at Thoth entry + * @property acc concatenated list of final stack states after Thoth exit + */ +data class FrameForEach( + val data: SpellList, + val code: SpellList, + val baseStack: List?, + val acc: MutableList +) : ContinuationFrame { + + /** When halting, we add the stack state at halt to the stack accumulator, then return the original pre-Thoth stack, plus the accumulator. */ + override fun breakDownwards(stack: List): Pair> { + val newStack = baseStack?.toMutableList() ?: mutableListOf() + acc.addAll(stack) + newStack.add(ListIota(acc)) + return true to newStack + } + + /** Step the Thoth computation, enqueueing one code evaluation. */ + override fun evaluate( + continuation: SpellContinuation, + level: ServerLevel, + harness: CastingHarness + ): CastingHarness.CastResult { + // If this isn't the very first Thoth step (i.e. no Thoth computations run yet)... + val stack = if (baseStack == null) { + // init stack to the harness stack... + harness.stack.toList() + } else { + // else save the stack to the accumulator and reuse the saved base stack. + acc.addAll(harness.stack) + baseStack + } + + // If we still have data to process... + val (stackTop, newCont) = if (data.nonEmpty) { + // Increment the evaluation depth, + harness.ctx.incDepth() + // push the next datum to the top of the stack, + data.car to continuation + // put the next Thoth object back on the stack for the next Thoth cycle, + .pushFrame(FrameForEach(data.cdr, code, stack, acc)) + // and prep the Thoth'd code block for evaluation. + .pushFrame(FrameEvaluate(code, true)) + } else { + // Else, dump our final list onto the stack. + ListIota(acc) to continuation + } + val tStack = stack.toMutableList() + tStack.add(stackTop) + // TODO: this means we could have Thoth casting do a different sound + return CastingHarness.CastResult( + newCont, + FunctionalData(tStack, 0, listOf(), false, harness.ravenmind), + ResolvedPatternType.EVALUATED, + listOf(), + HexEvalSounds.THOTH, + ) + } + + override fun serializeToNBT() = NBTBuilder { + "type" %= "foreach" + "data" %= data.serializeToNBT() + "code" %= code.serializeToNBT() + if (baseStack != null) + "base" %= baseStack.serializeToNBT() + "accumulator" %= acc.serializeToNBT() + } +} \ No newline at end of file diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FunctionalData.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FunctionalData.kt new file mode 100644 index 00000000..32ad396e --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/FunctionalData.kt @@ -0,0 +1,15 @@ +package at.petrak.hexcasting.api.spell.casting.eval + +import at.petrak.hexcasting.api.spell.iota.Iota + +/** + * A change to the data in a CastHarness after a pattern is drawn. + */ +data class FunctionalData( + val stack: List, + val parenCount: Int, + val parenthesized: List, + val escapeNext: Boolean, + val ravenmind: Iota? +) + diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/SpellContinuation.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/SpellContinuation.kt new file mode 100644 index 00000000..d956f6a0 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/eval/SpellContinuation.kt @@ -0,0 +1,12 @@ +package at.petrak.hexcasting.api.spell.casting.eval + +/** + * A continuation during the execution of a spell. + */ +sealed interface SpellContinuation { + object Done : SpellContinuation + + data class NotDone(val frame: ContinuationFrame, val next: SpellContinuation) : SpellContinuation + + fun pushFrame(frame: ContinuationFrame): SpellContinuation = NotDone(frame, this) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/EvalSound.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/EvalSound.java new file mode 100644 index 00000000..73e2ad71 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/EvalSound.java @@ -0,0 +1,18 @@ +package at.petrak.hexcasting.api.spell.casting.sideeffects; + +import net.minecraft.sounds.SoundEvent; +import org.jetbrains.annotations.Nullable; + +/** + * The kind of sound that plays after a cast. + * + * @param sound the actual sound file + * @param priority the priority of this sound. the sound with the highest priority in a given cast will be + * playd. + * shortcutMetacasting takes precedence over this. + */ +public record EvalSound(@Nullable SoundEvent sound, int priority) { + public EvalSound greaterOf(EvalSound that) { + return (this.priority > that.priority) ? this : that; + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/OperatorSideEffect.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/OperatorSideEffect.kt new file mode 100644 index 00000000..e1aa04f7 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/sideeffects/OperatorSideEffect.kt @@ -0,0 +1,100 @@ +package at.petrak.hexcasting.api.spell.casting.sideeffects + +import at.petrak.hexcasting.api.advancements.HexAdvancementTriggers +import at.petrak.hexcasting.api.block.circle.BlockEntityAbstractImpetus +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.mod.HexStatistics +import at.petrak.hexcasting.api.spell.ParticleSpray +import at.petrak.hexcasting.api.spell.RenderedSpell +import at.petrak.hexcasting.api.spell.casting.CastingHarness +import at.petrak.hexcasting.api.spell.mishaps.Mishap +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import at.petrak.hexcasting.common.lib.HexItems +import net.minecraft.Util +import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.ItemStack + +/** + * Things that happen after a spell is cast. + */ +sealed class OperatorSideEffect { + /** Return whether to cancel all further [OperatorSideEffect] */ + abstract fun performEffect(harness: CastingHarness): Boolean + + data class RequiredEnlightenment(val awardStat: Boolean) : OperatorSideEffect() { + override fun performEffect(harness: CastingHarness): Boolean { + harness.ctx.caster.sendSystemMessage("hexcasting.message.cant_great_spell".asTranslatedComponent) + + if (awardStat) + HexAdvancementTriggers.FAIL_GREAT_SPELL_TRIGGER.trigger(harness.ctx.caster) + + return true + } + } + + /** Try to cast a spell */ + data class AttemptSpell( + val spell: RenderedSpell, + val hasCastingSound: Boolean = true, + val awardStat: Boolean = true + ) : + OperatorSideEffect() { + override fun performEffect(harness: CastingHarness): Boolean { + this.spell.cast(harness.ctx) + if (awardStat) + harness.ctx.caster.awardStat(HexStatistics.SPELLS_CAST) + + return false + } + } + + data class ConsumeMedia(val amount: Int) : OperatorSideEffect() { + override fun performEffect(harness: CastingHarness): Boolean { + val overcastOk = harness.ctx.canOvercast + val leftoverMedia = harness.withdrawMedia(this.amount, overcastOk) + if (leftoverMedia > 0 && !overcastOk) { + harness.ctx.caster.sendSystemMessage("hexcasting.message.cant_overcast".asTranslatedComponent) + } + return leftoverMedia > 0 + } + } + + data class Particles(val spray: ParticleSpray) : OperatorSideEffect() { + override fun performEffect(harness: CastingHarness): Boolean { + this.spray.sprayParticles(harness.ctx.world, harness.getColorizer()) + + return false + } + } + + data class DoMishap(val mishap: Mishap, val errorCtx: Mishap.Context) : OperatorSideEffect() { + override fun performEffect(harness: CastingHarness): Boolean { + val msg = mishap.errorMessage(harness.ctx, errorCtx); + if (harness.ctx.spellCircle != null) { + val tile = harness.ctx.world.getBlockEntity(harness.ctx.spellCircle.impetusPos) + if (tile is BlockEntityAbstractImpetus) { + tile.lastMishap = msg + tile.setChanged() + } + } else { + // for now + harness.ctx.caster.sendSystemMessage(msg) + } + + val spray = mishap.particleSpray(harness.ctx) + val color = mishap.accentColor(harness.ctx, errorCtx) + spray.sprayParticles(harness.ctx.world, color) + spray.sprayParticles( + harness.ctx.world, + FrozenColorizer( + ItemStack(HexItems.DYE_COLORIZERS[DyeColor.RED]!!), + Util.NIL_UUID + ) + ) + + mishap.execute(harness.ctx, errorCtx, harness.stack) + + return true + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/BooleanIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/BooleanIota.java new file mode 100644 index 00000000..54e3f2be --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/BooleanIota.java @@ -0,0 +1,68 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class BooleanIota extends Iota { + public BooleanIota(boolean d) { + super(HexIotaTypes.BOOLEAN, d); + } + + public boolean getBool() { + return (boolean) this.payload; + } + + @Override + public boolean isTruthy() { + return this.getBool(); + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that) + && that instanceof BooleanIota b + && this.getBool() == b.getBool(); + } + + @Override + public @NotNull Tag serialize() { + // there is no boolean tag :( + return ByteTag.valueOf(this.getBool()); + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public BooleanIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + return BooleanIota.deserialize(tag); + } + + @Override + public Component display(Tag tag) { + return BooleanIota.display(BooleanIota.deserialize(tag).getBool()); + } + + @Override + public int color() { + // We can't set red or green ... so do yellow, I guess + return 0xff_ffff55; + } + }; + + public static BooleanIota deserialize(Tag tag) throws IllegalArgumentException { + var dtag = HexUtils.downcast(tag, ByteTag.TYPE); + return new BooleanIota(dtag.getAsByte() != 0); + } + + public static Component display(boolean b) { + return Component.translatable(b ? "hexcasting.tooltip.boolean_true" : "hexcasting.tooltip.boolean_false") + .withStyle(b ? ChatFormatting.DARK_GREEN : ChatFormatting.DARK_RED); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/DoubleIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/DoubleIota.java new file mode 100644 index 00000000..288501f7 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/DoubleIota.java @@ -0,0 +1,71 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class DoubleIota extends Iota { + public static final double TOLERANCE = 0.0001; + + public DoubleIota(double d) { + super(HexIotaTypes.DOUBLE, d); + } + + public double getDouble() { + return HexUtils.fixNAN((Double) this.payload); + } + + @Override + public boolean isTruthy() { + return this.getDouble() != 0.0; + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that) + && that instanceof DoubleIota dd + && tolerates(this.getDouble(), dd.getDouble()); + } + + public static boolean tolerates(double a, double b) { + return Math.abs(a - b) < TOLERANCE; + } + + @Override + public @NotNull Tag serialize() { + return DoubleTag.valueOf(this.getDouble()); + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public DoubleIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + return DoubleIota.deserialize(tag); + } + + @Override + public Component display(Tag tag) { + return DoubleIota.display(DoubleIota.deserialize(tag).getDouble()); + } + + @Override + public int color() { + return 0xff_55ff55; + } + }; + + public static DoubleIota deserialize(Tag tag) throws IllegalArgumentException { + var dtag = HexUtils.downcast(tag, DoubleTag.TYPE); + return new DoubleIota(dtag.getAsDouble()); + } + + public static Component display(double d) { + return Component.literal(String.format("%.2f", d)).withStyle(ChatFormatting.GREEN); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/EntityIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/EntityIota.java new file mode 100644 index 00000000..7c5b0be6 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/EntityIota.java @@ -0,0 +1,84 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class EntityIota extends Iota { + public EntityIota(@NotNull Entity e) { + super(HexIotaTypes.ENTITY, e); + } + + public Entity getEntity() { + return (Entity) this.payload; + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that) + && that instanceof EntityIota dent + && this.getEntity() == dent.getEntity(); + } + + @Override + public boolean isTruthy() { + return true; + } + + @Override + public @NotNull + Tag serialize() { + var out = new CompoundTag(); + out.putUUID("uuid", this.getEntity().getUUID()); + out.putString("name", Component.Serializer.toJson(this.getEntity().getName())); + return out; + } + + @Override + public Component display() { + return this.getEntity().getName().copy().withStyle(ChatFormatting.AQUA); + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public EntityIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + var ctag = HexUtils.downcast(tag, CompoundTag.TYPE); + Tag uuidTag = ctag.get("uuid"); + if (uuidTag == null) { + return null; + } + var uuid = NbtUtils.loadUUID(uuidTag); + var entity = world.getEntity(uuid); + if (entity == null) { + return null; + } + return new EntityIota(entity); + } + + @Override + public Component display(Tag tag) { + if (!(tag instanceof CompoundTag ctag)) { + return Component.translatable("hexcasting.spelldata.entity.whoknows"); + } + if (!ctag.contains("name", Tag.TAG_STRING)) { + return Component.translatable("hexcasting.spelldata.entity.whoknows"); + } + var nameJson = ctag.getString("name"); + return Component.Serializer.fromJsonLenient(nameJson).withStyle(ChatFormatting.AQUA); + } + + @Override + public int color() { + return 0xff_55ffff; + } + }; +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/GarbageIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/GarbageIota.java new file mode 100644 index 00000000..4d480f53 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/GarbageIota.java @@ -0,0 +1,63 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Random; + +/** + * this is LITERALLY a copy of NullIota but I can't see how to do it any better, i hate java generics + */ +public class GarbageIota extends Iota { + private static final Object NULL_SUBSTITUTE = new Object(); + + public static final Component DISPLAY = Component.literal("arimfexendrapuse") + .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.OBFUSCATED); + + private static final Random RANDOM = new Random(); + + public GarbageIota() { + // We have to pass *something* here, but there's nothing that actually needs to go there, + // so we just do this i guess + super(HexIotaTypes.GARBAGE, NULL_SUBSTITUTE); + } + + @Override + public boolean isTruthy() { + return false; + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that); + } + + @Override + public @NotNull Tag serialize() { + return new CompoundTag(); + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public GarbageIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + return new GarbageIota(); + } + + @Override + public Component display(Tag tag) { + return DISPLAY; + } + + @Override + public int color() { + return 0xff_505050; + } + }; +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Iota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Iota.java new file mode 100644 index 00000000..90489361 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Iota.java @@ -0,0 +1,56 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +public abstract class Iota { + @NotNull + protected final Object payload; + @NotNull + protected final IotaType type; + + protected Iota(@NotNull IotaType type, @NotNull Object payload) { + this.type = type; + this.payload = payload; + } + + public @NotNull IotaType getType() { + return this.type; + } + + abstract public boolean isTruthy(); + + /** + * Compare this to another object, within a tolerance. + */ + abstract protected boolean toleratesOther(Iota that); + + /** + * Serialize this under the {@code data} tag. + *

+ * You probably don't want to call this directly; use {@link HexIotaTypes#serialize}. + */ + abstract public @NotNull Tag serialize(); + + public Component display() { + return this.type.display(this.serialize()); + } + + /** + * Helper method to see if two iotas have the same type. + */ + public static boolean typesMatch(Iota a, Iota b) { + var resA = HexIotaTypes.REGISTRY.getKey(a.getType()); + var resB = HexIotaTypes.REGISTRY.getKey(b.getType()); + return resA != null && resA.equals(resB); + } + + /** + * Helper method to see if either iota tolerates the other. + */ + public static boolean tolerates(Iota a, Iota b) { + return a.toleratesOther(b) || b.toleratesOther(a); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/IotaType.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/IotaType.java new file mode 100644 index 00000000..f40f024c --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/IotaType.java @@ -0,0 +1,44 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextColor; +import net.minecraft.server.level.ServerLevel; + +import javax.annotation.Nullable; + +// Take notes from ForgeRegistryEntry +public abstract class IotaType { + /** + * Spell datums are stored as such: {@code { "type": "modid:type", "datum": a_tag }}. + *

+ * The {@code type} key is given when registering the spell datum type; this method + * deserializes the tag associated with {@code "datum"}. + *

+ * Returning {@code null} makes the resulting datum be {@link NullIota}. + * Throwing an exception raises a mishap. + */ + @Nullable + public abstract T deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException; + + /** + * Get a display of this datum from the {@code data} tag, without the world. + * This is for use on the client. + */ + public abstract Component display(Tag tag); + + /** + * Get the color associated with this datum type. + */ + public abstract int color(); + + /** + * Get a display component that's the name of this iota type. + */ + public Component typeName() { + var key = HexIotaTypes.REGISTRY.getKey(this); + return Component.translatable("hexcasting.iota." + key) + .withStyle(style -> style.withColor(TextColor.fromRgb(color()))); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/ListIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/ListIota.java new file mode 100644 index 00000000..69f7f3a4 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/ListIota.java @@ -0,0 +1,117 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.api.spell.SpellList; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * This is a wrapper for {@link SpellList}. + */ +public class ListIota extends Iota { + public ListIota(@NotNull SpellList list) { + super(HexIotaTypes.LIST, list); + } + + public ListIota(@NotNull List list) { + this(new SpellList.LList(list)); + } + + public SpellList getList() { + return (SpellList) this.payload; + } + + @Override + public boolean isTruthy() { + return this.getList().getNonEmpty(); + } + + @Override + public boolean toleratesOther(Iota that) { + if (!typesMatch(this, that)) { + return false; + } + var a = this.getList(); + if (!(that instanceof ListIota list)) { + return false; + } + var b = list.getList(); + + SpellList.SpellListIterator aIter = a.iterator(), bIter = b.iterator(); + for (; ; ) { + if (!aIter.hasNext() && !bIter.hasNext()) { + // we ran out together! + return true; + } + if (aIter.hasNext() != bIter.hasNext()) { + // one remains full before the other + return false; + } + Iota x = aIter.next(), y = bIter.next(); + if (!Iota.tolerates(x, y)) { + return false; + } + } + } + + @Override + public @NotNull Tag serialize() { + var out = new ListTag(); + for (var subdatum : this.getList()) { + out.add(HexIotaTypes.serialize(subdatum)); + } + return out; + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public ListIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + var listTag = HexUtils.downcast(tag, ListTag.TYPE); + var out = new ArrayList(listTag.size()); + + for (var sub : listTag) { + var csub = HexUtils.downcast(sub, CompoundTag.TYPE); + var subiota = HexIotaTypes.deserialize(csub, world); + if (subiota == null) { + return null; + } + out.add(subiota); + } + + return new ListIota(out); + } + + @Override + public Component display(Tag tag) { + var out = Component.empty(); + var list = HexUtils.downcast(tag, ListTag.TYPE); + for (int i = 0; i < list.size(); i++) { + Tag sub = list.get(i); + var csub = HexUtils.downcast(sub, CompoundTag.TYPE); + + out.append(HexIotaTypes.getDisplay(csub)); + + if (i < list.size() - 1) { + out.append(", "); + } + } + return Component.translatable("hexcasting.tooltip.list_contents", out).withStyle(ChatFormatting.DARK_PURPLE); + } + + @Override + public int color() { + return 0xff_aa00aa; + } + }; +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/NullIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/NullIota.java new file mode 100644 index 00000000..30ab1b2b --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/NullIota.java @@ -0,0 +1,59 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * An iota with no data associated with it. + */ +public class NullIota extends Iota { + private static final Object NULL_SUBSTITUTE = new Object(); + + public static final Component DISPLAY = + Component.translatable("hexcasting.tooltip.null_iota").withStyle(ChatFormatting.GRAY); + + public NullIota() { + // We have to pass *something* here, but there's nothing that actually needs to go there, + // so we just do this i guess + super(HexIotaTypes.NULL, NULL_SUBSTITUTE); + } + + @Override + public boolean isTruthy() { + return false; + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that); + } + + @Override + public @NotNull Tag serialize() { + return new CompoundTag(); + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public NullIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + return new NullIota(); + } + + @Override + public Component display(Tag tag) { + return DISPLAY; + } + + @Override + public int color() { + return 0xff_aaaaaa; + } + }; +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/PatternIota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/PatternIota.java new file mode 100644 index 00000000..f7a28597 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/PatternIota.java @@ -0,0 +1,82 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.api.spell.math.HexPattern; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PatternIota extends Iota { + public PatternIota(@NotNull HexPattern pattern) { + super(HexIotaTypes.PATTERN, pattern); + } + + public HexPattern getPattern() { + return (HexPattern) this.payload; + } + + protected PatternIota(@NotNull IotaType type, @NotNull Object payload) { + super(type, payload); + } + + @Override + public boolean isTruthy() { + return true; + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that) + && that instanceof PatternIota piota + && this.getPattern().anglesSignature().equals(piota.getPattern().anglesSignature()); + } + + @Override + public @NotNull Tag serialize() { + return this.getPattern().serializeToNBT(); + } + + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public PatternIota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + return PatternIota.deserialize(tag); + } + + @Override + public Component display(Tag tag) { + return PatternIota.display(PatternIota.deserialize(tag).getPattern()); + } + + @Override + public int color() { + return 0xff_ffaa00; + } + }; + + public static PatternIota deserialize(Tag tag) throws IllegalArgumentException { + var patTag = HexUtils.downcast(tag, CompoundTag.TYPE); + HexPattern pat = HexPattern.fromNBT(patTag); + return new PatternIota(pat); + } + + public static Component display(HexPattern pat) { + var bob = new StringBuilder(); + bob.append(pat.getStartDir()); + + var sig = pat.anglesSignature(); + if (!sig.isEmpty()) { + bob.append(" "); + bob.append(sig); + } + return Component.translatable("hexcasting.tooltip.pattern_iota", + Component.literal(bob.toString()).withStyle(ChatFormatting.WHITE)) + .withStyle(ChatFormatting.GOLD); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Vec3Iota.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Vec3Iota.java new file mode 100644 index 00000000..1babae96 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/iota/Vec3Iota.java @@ -0,0 +1,78 @@ +package at.petrak.hexcasting.api.spell.iota; + +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.LongArrayTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class Vec3Iota extends Iota { + public Vec3Iota(@NotNull Vec3 datum) { + super(HexIotaTypes.VEC3, datum); + } + + public Vec3 getVec3() { + var v = (Vec3) this.payload; + return new Vec3( + HexUtils.fixNAN(v.x), + HexUtils.fixNAN(v.y), + HexUtils.fixNAN(v.z) + ); + } + + @Override + public boolean isTruthy() { + var v = this.getVec3(); + return v.x != 0.0 && v.y != 0.0 && v.z != 0.0; + } + + @Override + public boolean toleratesOther(Iota that) { + return typesMatch(this, that) + && that instanceof Vec3Iota viota + && this.getVec3().distanceToSqr(viota.getVec3()) < DoubleIota.TOLERANCE * DoubleIota.TOLERANCE; + } + + @Override + public @NotNull Tag serialize() { + return HexUtils.serializeToNBT(this.getVec3()); + } + + public static IotaType TYPE = new IotaType<>() { + @Nullable + @Override + public Vec3Iota deserialize(Tag tag, ServerLevel world) throws IllegalArgumentException { + return Vec3Iota.deserialize(tag); + } + + @Override + public Component display(Tag tag) { + return Vec3Iota.display(Vec3Iota.deserialize(tag).getVec3()); + } + + @Override + public int color() { + return 0xff_ff3030; + } + }; + + public static Vec3Iota deserialize(Tag tag) throws IllegalArgumentException { + var lat = HexUtils.downcast(tag, LongArrayTag.TYPE); + var vec = HexUtils.vecFromNBT(lat.getAsLongArray()); + return new Vec3Iota(vec); + } + + public static Component display(double x, double y, double z) { + return Component.literal(String.format("(%.2f, %.2f, %.2f)", x, y, z)) + .withStyle(ChatFormatting.RED); + } + + public static Component display(Vec3 v) { + return display(v.x, v.y, v.z); + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/EulerPathFinder.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/EulerPathFinder.kt new file mode 100644 index 00000000..efdbe780 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/EulerPathFinder.kt @@ -0,0 +1,88 @@ +package at.petrak.hexcasting.api.spell.math + +import at.petrak.hexcasting.api.HexAPI +import java.util.* +import kotlin.random.Random + +object EulerPathFinder { + /** + * Find an alternative way to draw the given pattern, based on a random seed. + */ + @JvmStatic + @JvmOverloads + fun findAltDrawing(original: HexPattern, seed: Long, rule: (HexPattern) -> Boolean = { true }): HexPattern { + // http://www.graph-magics.com/articles/euler.php + + val rand = Random(seed) + + // Don't try for too long, in case all paths are exhausted. + // Unlikely to ever actually reach this limit, and can only happen if the same pattern + // is registered both as a Great Pattern and as a special handler or regular pattern, + // or if the random seed has some sort of strange repeating property to it. + var iterationsLeft = 100 + var path: HexPattern + while (iterationsLeft > 0) { + iterationsLeft-- + path = walkPath(original, rand) + if (rule(path)) { + return path + } + } + + HexAPI.LOGGER.warn("Didn't find alternate path for {} in time", original) + return original + } + + private fun walkPath(original: HexPattern, rand: Random): HexPattern { + val graph = toGraph(original) + val oddNodes = graph.filter { (_, dirs) -> dirs.size % 2 == 1 } + var current: HexCoord = when (oddNodes.size) { + // An euler-walkable graph must have 0 odd nodes and start anywhere... + 0 -> graph.keys.random(rand) + // or two, and start at one of them + 2 -> oddNodes.keys.random(rand) + else -> throw IllegalStateException() + } + + val stack = Stack() + val out = mutableListOf() + do { + val exits = graph[current]!! + if (exits.isEmpty()) { + out.add(current) + current = stack.pop() + } else { + stack.push(current) + // This is where the random part happens, mostly + val burnDir = exits.random(rand) + exits.remove(burnDir) + graph[current + burnDir]?.remove(burnDir * HexAngle.BACK) + current += burnDir + } + } while (graph[current]?.isNotEmpty() == true || stack.isNotEmpty()) + out.add(current) + + val dirs = out.zipWithNext { a, b -> a.immediateDelta(b)!! } + val angles = dirs.zipWithNext { a, b -> b.angleFrom(a) } + return HexPattern(dirs[0], angles.toMutableList()) + } + + private fun toGraph(pat: HexPattern): HashMap> { + val graph = HashMap>() + + var compass: HexDir = pat.startDir + var cursor = HexCoord.Origin + for (a in pat.angles) { + // i hate kotlin + graph.getOrPut(cursor) { EnumSet.noneOf(HexDir::class.java) }.add(compass) + graph.getOrPut(cursor + compass) { EnumSet.noneOf(HexDir::class.java) }.add(compass * HexAngle.BACK) + + cursor += compass + compass *= a + } + graph.getOrPut(cursor) { EnumSet.noneOf(HexDir::class.java) }.add(compass) + graph.getOrPut(cursor + compass) { EnumSet.noneOf(HexDir::class.java) }.add(compass * HexAngle.BACK) + + return graph + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexAngle.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexAngle.kt new file mode 100644 index 00000000..4565329b --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexAngle.kt @@ -0,0 +1,8 @@ +package at.petrak.hexcasting.api.spell.math + +enum class HexAngle { + FORWARD, RIGHT, RIGHT_BACK, BACK, LEFT_BACK, LEFT; + + fun rotatedBy(a: HexAngle) = values()[(this.ordinal + a.ordinal) % values().size] + operator fun times(a: HexAngle) = this.rotatedBy(a) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexCoord.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexCoord.kt new file mode 100644 index 00000000..82506f0e --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexCoord.kt @@ -0,0 +1,62 @@ +package at.petrak.hexcasting.api.spell.math + +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min + +/** + * Uses axial coordinates as per https://www.redblobgames.com/grids/hexagons/ + */ +data class HexCoord(val q: Int, val r: Int) { + fun s(): Int = this.q - this.r + + fun shiftedBy(x: HexCoord): HexCoord = HexCoord(this.q + x.q, this.r + x.r) + + fun shiftedBy(d: HexDir) = this.shiftedBy(d.asDelta()) + + fun delta(x: HexCoord): HexCoord = HexCoord(this.q - x.q, this.r - x.r) + + operator fun plus(x: HexCoord) = this.shiftedBy(x) + operator fun plus(d: HexDir) = this.shiftedBy(d) + operator fun minus(x: HexCoord) = this.delta(x) + + fun distanceTo(x: HexCoord) = + (abs(this.q - x.q) + abs(this.q + this.r - x.q - x.r) + abs(this.r - x.r)) / 2 + + fun rangeAround(radius: Int): Iterator = RingIter(this, radius) + + /** Get the direction that would bring you from this to its neighbor */ + fun immediateDelta(neighbor: HexCoord): HexDir? = + when (neighbor - this) { + HexCoord(1, 0) -> HexDir.EAST + HexCoord(0, 1) -> HexDir.SOUTH_EAST + HexCoord(-1, 1) -> HexDir.SOUTH_WEST + HexCoord(-1, 0) -> HexDir.WEST + HexCoord(0, -1) -> HexDir.NORTH_WEST + HexCoord(1, -1) -> HexDir.NORTH_EAST + else -> null + } + + // https://docs.rs/hex2d/1.1.0/src/hex2d/lib.rs.html#785 + private class RingIter(val center: HexCoord, val radius: Int) : Iterator { + var q: Int = -radius + var r: Int = max(-radius, 0) + + override fun hasNext(): Boolean = r <= radius + min(0, -q) || q < radius + + override fun next(): HexCoord { + if (r > radius + min(0, -q)) { + q++ + r = -radius + max(0, -q) + } + val out = HexCoord(center.q + q, center.r + r) + r++ + return out + } + } + + companion object { + @JvmStatic + val Origin = HexCoord(0, 0) + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexDir.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexDir.kt new file mode 100644 index 00000000..afef8666 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexDir.kt @@ -0,0 +1,34 @@ +package at.petrak.hexcasting.api.spell.math + +import at.petrak.hexcasting.api.utils.getSafe + +enum class HexDir { + NORTH_EAST, EAST, SOUTH_EAST, SOUTH_WEST, WEST, NORTH_WEST; + + fun rotatedBy(a: HexAngle): HexDir = + values()[(this.ordinal + a.ordinal).mod(values().size)] + + operator fun times(a: HexAngle) = this.rotatedBy(a) + + fun angleFrom(other: HexDir): HexAngle = + HexAngle.values()[(this.ordinal - other.ordinal).mod(HexAngle.values().size)] + + operator fun minus(other: HexDir) = this.angleFrom(other) + + fun asDelta(): HexCoord = + when (this) { + NORTH_EAST -> HexCoord(1, -1) + EAST -> HexCoord(1, 0) + SOUTH_EAST -> HexCoord(0, 1) + SOUTH_WEST -> HexCoord(-1, 1) + WEST -> HexCoord(-1, 0) + NORTH_WEST -> HexCoord(0, -1) + } + + companion object { + @JvmStatic + fun fromString(key: String): HexDir { + return values().getSafe(key, WEST) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexPattern.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexPattern.kt new file mode 100644 index 00000000..d05d6874 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/math/HexPattern.kt @@ -0,0 +1,171 @@ +package at.petrak.hexcasting.api.spell.math + +import at.petrak.hexcasting.api.utils.NBTBuilder +import at.petrak.hexcasting.api.utils.coordToPx +import at.petrak.hexcasting.api.utils.findCenter +import at.petrak.hexcasting.api.utils.getSafe +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.Tag +import net.minecraft.world.phys.Vec2 + +/** + * Sequence of angles to define a pattern traced. + */ +data class HexPattern(public val startDir: HexDir, public val angles: MutableList = arrayListOf()) { + /** + * @return True if it successfully appended, false if not. + */ + fun tryAppendDir(newDir: HexDir): Boolean { + // Two restrictions: + // - No adding a pos/dir pair we previously added + // - No backtracking + val linesSeen = mutableSetOf>() + + var compass = this.startDir + var cursor = HexCoord.Origin + for (a in this.angles) { + linesSeen.add(cursor to compass) + // Line from here to there also blocks there to here + linesSeen.add(cursor + compass to compass.rotatedBy(HexAngle.BACK)) + cursor += compass + compass *= a + } + cursor += compass + + val potentialNewLine = cursor to newDir + if (potentialNewLine in linesSeen) return false + val nextAngle = newDir - compass + if (nextAngle == HexAngle.BACK) return false + + this.angles.add(nextAngle) + return true + } + + @JvmOverloads + fun positions(start: HexCoord = HexCoord.Origin): List { + val out: ArrayList = ArrayList(this.angles.size + 2) + out.add(start) + var compass: HexDir = this.startDir + var cursor = start + for (a in this.angles) { + cursor += compass + out.add(cursor) + compass *= a + } + out.add(cursor + compass) + return out + } + + fun directions(): List { + val out = ArrayList(this.angles.size + 1) + out.add(this.startDir) + + var compass: HexDir = this.startDir + for (a in this.angles) { + compass *= a + out.add(compass) + } + return out + } + + fun finalDir(): HexDir = + this.angles.fold(this.startDir) { acc, angle -> acc * angle } + + + fun serializeToNBT() = NBTBuilder { + TAG_START_DIR %= byte(startDir.ordinal) + TAG_ANGLES %= byteArray(angles.map(HexAngle::ordinal)) + } + + // Terrible shorthand method for easy matching + fun anglesSignature(): String { + return buildString { + for (a in this@HexPattern.angles) { + append( + when (a) { + HexAngle.FORWARD -> "w" + HexAngle.RIGHT -> "e" + HexAngle.RIGHT_BACK -> "d" + HexAngle.BACK -> "s" + HexAngle.LEFT_BACK -> "a" + HexAngle.LEFT -> "q" + } + ) + } + } + } + + /** + * Return the "center of mass" of the pattern. + * Drawing the pattern with the returned vector as the origin will center the pattern around it. + */ + @JvmOverloads + fun getCenter(hexRadius: Float, origin: HexCoord = HexCoord.Origin): Vec2 { + val originPx = coordToPx(origin, hexRadius, Vec2.ZERO) + val points = this.toLines(hexRadius, originPx) + return findCenter(points) + } + + + /** + * Convert a hex pattern into a sequence of straight linePoints spanning its points. + */ + fun toLines(hexSize: Float, origin: Vec2): List = + this.positions().map { coordToPx(it, hexSize, origin) } + + fun sigsEqual(that: HexPattern) = this.anglesSignature() == that.anglesSignature() + + override fun toString(): String = buildString { + append("HexPattern[") + append(this@HexPattern.startDir) + append(", ") + append(this@HexPattern.anglesSignature()) + append("]") + } + + companion object { + const val TAG_START_DIR = "start_dir" + const val TAG_ANGLES = "angles" + + @JvmStatic + fun isPattern(tag: CompoundTag): Boolean { + return tag.contains(TAG_START_DIR, Tag.TAG_ANY_NUMERIC.toInt()) && tag.contains( + TAG_ANGLES, + Tag.TAG_BYTE_ARRAY.toInt() + ) + } + + @JvmStatic + fun fromNBT(tag: CompoundTag): HexPattern { + val startDir = HexDir.values().getSafe(tag.getByte(TAG_START_DIR)) + val angles = tag.getByteArray(TAG_ANGLES).map(HexAngle.values()::getSafe) + return HexPattern(startDir, angles.toMutableList()) + } + + @JvmStatic + fun fromAngles(signature: String, startDir: HexDir): HexPattern { + val out = HexPattern(startDir) + var compass = startDir + + for ((idx, c) in signature.withIndex()) { + val angle = when (c) { + 'w' -> HexAngle.FORWARD + 'e' -> HexAngle.RIGHT + 'd' -> HexAngle.RIGHT_BACK + // for completeness ... + 's' -> HexAngle.BACK + 'a' -> HexAngle.LEFT_BACK + 'q' -> HexAngle.LEFT + else -> throw IllegalArgumentException("Cannot match $c at idx $idx to a direction") + } + compass *= angle + val success = out.tryAppendDir(compass) + if (!success) { + throw IllegalStateException("Adding the angle $c at index $idx made the pattern invalid by looping back on itself") + } + } + return out + } + + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/Mishap.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/Mishap.kt new file mode 100644 index 00000000..44ee54f9 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/Mishap.kt @@ -0,0 +1,142 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.mod.HexTags +import at.petrak.hexcasting.api.spell.Action +import at.petrak.hexcasting.api.spell.ParticleSpray +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.math.HexPattern +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import at.petrak.hexcasting.api.utils.lightPurple +import at.petrak.hexcasting.common.lib.HexItems +import at.petrak.hexcasting.ktxt.* +import at.petrak.hexcasting.xplat.IXplatAbstractions +import net.minecraft.Util +import net.minecraft.core.BlockPos +import net.minecraft.network.chat.Component +import net.minecraft.world.InteractionHand +import net.minecraft.world.damagesource.DamageSource +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.item.ItemEntity +import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.ItemStack +import net.minecraft.world.phys.Vec3 + +abstract class Mishap : Throwable() { + /** Mishaps spray half-red, half-this-color. */ + abstract fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer + + open fun particleSpray(ctx: CastingContext): ParticleSpray { + return ParticleSpray(ctx.position.add(0.0, 0.2, 0.0), Vec3(0.0, 2.0, 0.0), 0.2, Math.PI / 4, 40) + } + + open fun resolutionType(ctx: CastingContext): ResolvedPatternType = ResolvedPatternType.ERRORED + + /** + * Execute the actual effect, not any sfx. + * + * You can also mess up the stack with this. + */ + abstract fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) + + abstract fun errorMessage(ctx: CastingContext, errorCtx: Context): Component + + // Useful helper functions + + protected fun dyeColor(color: DyeColor): FrozenColorizer = + FrozenColorizer( + ItemStack(HexItems.DYE_COLORIZERS[color]!!), + Util.NIL_UUID + ) + + protected fun error(stub: String, vararg args: Any): Component = + "hexcasting.mishap.$stub".asTranslatedComponent(*args) + + protected fun actionName(action: Action?): Component = + action?.displayName ?: "hexcasting.spell.null".asTranslatedComponent.lightPurple + + protected fun yeetHeldItemsTowards(ctx: CastingContext, targetPos: Vec3) { + // Knock the player's items out of their hands + val items = mutableListOf() + for (hand in InteractionHand.values()) { + if (hand != ctx.castingHand || ctx.caster.getItemInHand(hand).`is`(HexTags.Items.STAVES)) { + items.add(ctx.caster.getItemInHand(hand).copy()) + ctx.caster.setItemInHand(hand, ItemStack.EMPTY) + } + } + + val delta = targetPos.subtract(ctx.position).normalize().scale(0.5) + + for (item in items) { + yeetItem(item, ctx, delta) + } + } + + protected fun yeetHeldItem(ctx: CastingContext, hand: InteractionHand) { + val item = ctx.caster.getItemInHand(hand).copy() + if (hand == ctx.castingHand && IXplatAbstractions.INSTANCE.findHexHolder(item) != null) + return + ctx.caster.setItemInHand(hand, ItemStack.EMPTY) + + val delta = ctx.caster.lookAngle.scale(0.5) + yeetItem(item, ctx, delta) + } + + protected fun yeetItem(stack: ItemStack, ctx: CastingContext, delta: Vec3) { + val entity = ItemEntity( + ctx.world, + ctx.position.x, ctx.position.y, ctx.position.z, + stack, + delta.x + (Math.random() - 0.5) * 0.1, + delta.y + (Math.random() - 0.5) * 0.1, + delta.z + (Math.random() - 0.5) * 0.1 + ) + entity.setPickUpDelay(40) + ctx.world.addWithUUID(entity) + } + + protected fun blockAtPos(ctx: CastingContext, pos: BlockPos): Component { + return ctx.world.getBlockState(pos).block.name + } + + data class Context(val pattern: HexPattern, val action: Action?) + + companion object { + fun trulyHurt(entity: LivingEntity, source: DamageSource, amount: Float) { + entity.setHurtWithStamp(source, entity.level.gameTime) + + val targetHealth = entity.health - amount + if (entity.invulnerableTime > 10) { + val lastHurt = entity.lastHurt + if (lastHurt < amount) + entity.invulnerableTime = 0 + else + entity.lastHurt -= amount + } + if (!entity.hurt(source, amount) && + !entity.isInvulnerableTo(source) && + !entity.level.isClientSide && + !entity.isDeadOrDying + ) { + + // Ok, if you REALLY don't want to play nice... + entity.health = targetHealth + entity.markHurt() + + if (entity.isDeadOrDying) { + if (!entity.checkTotemDeathProtection(source)) { + val sound = entity.deathSoundAccessor + if (sound != null) { + entity.playSound(sound, entity.soundVolumeAccessor, entity.voicePitch) + } + entity.die(source) + } + } else { + entity.playHurtSound(source) + } + } + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapAlreadyBrainswept.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapAlreadyBrainswept.kt new file mode 100644 index 00000000..d23b1092 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapAlreadyBrainswept.kt @@ -0,0 +1,25 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.misc.HexDamageSources +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.ParticleSpray +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.world.entity.npc.Villager +import net.minecraft.world.item.DyeColor + +class MishapAlreadyBrainswept(val villager: Villager) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.GREEN) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + villager.hurt(HexDamageSources.overcastDamageFrom(ctx.caster), villager.health) + } + + override fun particleSpray(ctx: CastingContext) = + ParticleSpray.burst(villager.eyePosition, 1.0) + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("already_brainswept") + +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBlock.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBlock.kt new file mode 100644 index 00000000..822515c1 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBlock.kt @@ -0,0 +1,34 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.ParticleSpray +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import net.minecraft.core.BlockPos +import net.minecraft.network.chat.Component +import net.minecraft.world.item.DyeColor +import net.minecraft.world.level.Explosion +import net.minecraft.world.phys.Vec3 + +class MishapBadBlock(val pos: BlockPos, val expected: Component) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.LIME) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + ctx.world.explode(null, pos.x + 0.5, pos.y + 0.5, pos.z + 0.5, 0.25f, Explosion.BlockInteraction.NONE) + } + + override fun particleSpray(ctx: CastingContext) = + ParticleSpray.burst(Vec3.atCenterOf(pos), 1.0) + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("bad_block", expected, this.pos.toShortString(), blockAtPos(ctx, this.pos)) + + companion object { + @JvmStatic + fun of(pos: BlockPos, stub: String): MishapBadBlock { + return MishapBadBlock(pos, "hexcasting.mishap.bad_block.$stub".asTranslatedComponent) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBrainsweep.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBrainsweep.kt new file mode 100644 index 00000000..7f121c18 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadBrainsweep.kt @@ -0,0 +1,27 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.misc.HexDamageSources +import at.petrak.hexcasting.api.spell.ParticleSpray +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.npc.Villager +import net.minecraft.world.item.DyeColor +import net.minecraft.world.phys.Vec3 + +class MishapBadBrainsweep(val villager: Villager, val pos: BlockPos) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.GREEN) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + trulyHurt(villager, HexDamageSources.overcastDamageFrom(ctx.caster), villager.health) + } + + override fun particleSpray(ctx: CastingContext): ParticleSpray { + return ParticleSpray.burst(Vec3.atCenterOf(pos), 1.0) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("bad_brainsweep", blockAtPos(ctx, this.pos)) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadEntity.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadEntity.kt new file mode 100644 index 00000000..ba3cbcec --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadEntity.kt @@ -0,0 +1,33 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.utils.aqua +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.item.ItemEntity +import net.minecraft.world.item.DyeColor + +class MishapBadEntity(val entity: Entity, val wanted: Component) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BROWN) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + yeetHeldItemsTowards(ctx, entity.position()) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("bad_entity", actionName(errorCtx.action), wanted, entity.displayName.plainCopy().aqua) + + companion object { + @JvmStatic + fun of(entity: Entity, stub: String): Mishap { + val component = "hexcasting.mishap.bad_item.$stub".asTranslatedComponent + if (entity is ItemEntity) + return MishapBadItem(entity, component) + return MishapBadEntity(entity, component) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadItem.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadItem.kt new file mode 100644 index 00000000..e147e634 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadItem.kt @@ -0,0 +1,30 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.item.ItemEntity +import net.minecraft.world.item.DyeColor + +class MishapBadItem(val item: ItemEntity, val wanted: Component) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BROWN) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + item.deltaMovement = item.deltaMovement.add((Math.random() - 0.5) * 0.05, 0.75, (Math.random() - 0.5) * 0.05) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = if (item.item.isEmpty) + error("no_item", actionName(errorCtx.action), wanted) + else + error("bad_item", actionName(errorCtx.action), wanted, item.item.count, item.item.displayName) + + companion object { + @JvmStatic + fun of(item: ItemEntity, stub: String): MishapBadItem { + return MishapBadItem(item, "hexcasting.mishap.bad_item.$stub".asTranslatedComponent) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadOffhandItem.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadOffhandItem.kt new file mode 100644 index 00000000..71dda350 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapBadOffhandItem.kt @@ -0,0 +1,31 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import net.minecraft.network.chat.Component +import net.minecraft.world.InteractionHand +import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.ItemStack + +class MishapBadOffhandItem(val item: ItemStack, val hand: InteractionHand, val wanted: Component) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BROWN) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + yeetHeldItem(ctx, hand) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = if (item.isEmpty) + error("no_item.offhand", actionName(errorCtx.action), wanted) + else + error("bad_item.offhand", actionName(errorCtx.action), wanted, item.count, item.displayName) + + companion object { + @JvmStatic + fun of(item: ItemStack, hand: InteractionHand, stub: String, vararg args: Any): MishapBadOffhandItem { + return MishapBadOffhandItem(item, hand, "hexcasting.mishap.bad_item.$stub".asTranslatedComponent(*args)) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDisallowedSpell.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDisallowedSpell.kt new file mode 100644 index 00000000..65da779f --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDisallowedSpell.kt @@ -0,0 +1,21 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType +import net.minecraft.world.item.DyeColor + +class MishapDisallowedSpell(val type: String = "disallowed") : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLACK) + + override fun resolutionType(ctx: CastingContext) = ResolvedPatternType.INVALID + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + // NO-OP + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error(type, actionName(errorCtx.action)) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDivideByZero.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDivideByZero.kt new file mode 100644 index 00000000..7b9ec707 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapDivideByZero.kt @@ -0,0 +1,75 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.misc.HexDamageSources +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.DoubleIota +import at.petrak.hexcasting.api.spell.iota.GarbageIota +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.Vec3Iota +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import net.minecraft.network.chat.Component +import net.minecraft.world.item.DyeColor +import net.minecraft.world.phys.Vec3 + +class MishapDivideByZero(val operand1: Component, val operand2: Component, val suffix: String = "divide") : Mishap() { + + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.RED) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + stack.add(GarbageIota()) + trulyHurt(ctx.caster, HexDamageSources.OVERCAST, ctx.caster.health / 2) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("divide_by_zero.$suffix", operand1, operand2) + + companion object { + private const val PREFIX = "hexcasting.mishap.divide_by_zero" + + @JvmStatic + fun of(operand1: Iota, operand2: Iota, suffix: String = "divide"): MishapDivideByZero { + if (suffix == "exponent") + return MishapDivideByZero(translate(operand1), powerOf(operand2), suffix) + return MishapDivideByZero(translate(operand1), translate(operand2), suffix) + } + + @JvmStatic + fun tan(angle: DoubleIota): MishapDivideByZero { + val translatedAngle = translate(angle) + return MishapDivideByZero( + "$PREFIX.sin".asTranslatedComponent(translatedAngle), + "$PREFIX.cos".asTranslatedComponent(translatedAngle) + ) + } + + @JvmStatic + val zero + get() = "$PREFIX.zero".asTranslatedComponent + + @JvmStatic + val zerothPower + get() = "$PREFIX.zero.power".asTranslatedComponent + + @JvmStatic + val zeroVector + get() = "$PREFIX.zero.vec".asTranslatedComponent + + @JvmStatic + fun powerOf(power: Component) = "$PREFIX.power".asTranslatedComponent(power) + + @JvmStatic + fun powerOf(datum: Iota): Component = when { + datum is DoubleIota && datum.double == 0.0 -> zerothPower + else -> datum.display() + } + + @JvmStatic + fun translate(datum: Iota): Component = when { + datum is DoubleIota && datum.double == 0.0 -> zero + datum is Vec3Iota && datum.vec3 == Vec3.ZERO -> zeroVector + else -> datum.display() + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEntityTooFarAway.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEntityTooFarAway.kt new file mode 100644 index 00000000..5eb5fab7 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEntityTooFarAway.kt @@ -0,0 +1,21 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.Iota +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.Entity +import net.minecraft.world.item.DyeColor + +class MishapEntityTooFarAway(val entity: Entity) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.PINK) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + // Knock the player's items out of their hands + yeetHeldItemsTowards(ctx, entity.position()) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context): Component = + error("entity_too_far", entity.displayName, actionName(errorCtx.action)) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapError.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapError.kt new file mode 100644 index 00000000..0f6d4666 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapError.kt @@ -0,0 +1,18 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.world.item.DyeColor + +class MishapError(val exception: Exception) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLACK) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + // NO-OP + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("unknown", actionName(errorCtx.action), exception) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEvalTooDeep.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEvalTooDeep.kt new file mode 100644 index 00000000..c118486f --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapEvalTooDeep.kt @@ -0,0 +1,18 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.world.item.DyeColor + +class MishapEvalTooDeep : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLUE) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + ctx.caster.airSupply -= 290 + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("eval_too_deep") +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapImmuneEntity.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapImmuneEntity.kt new file mode 100644 index 00000000..793641f4 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapImmuneEntity.kt @@ -0,0 +1,20 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.utils.aqua +import net.minecraft.world.entity.Entity +import net.minecraft.world.item.DyeColor + +class MishapImmuneEntity(val entity: Entity) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLUE) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + yeetHeldItemsTowards(ctx, entity.position()) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("immune_entity", actionName(errorCtx.action), entity.displayName.plainCopy().aqua) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidIota.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidIota.kt new file mode 100644 index 00000000..1e1b6b83 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidIota.kt @@ -0,0 +1,46 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.GarbageIota +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.utils.asTranslatedComponent +import net.minecraft.network.chat.Component +import net.minecraft.world.item.DyeColor + +/** + * The value failed some kind of predicate. + * + * [MishapInvalidIota.reverseIdx] is the index from the *back* of the stack. + */ +class MishapInvalidIota( + val perpetrator: Iota, + val reverseIdx: Int, + val expected: Component +) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.GRAY) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + stack[stack.size - 1 - reverseIdx] = GarbageIota(); + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error( + "invalid_value", actionName(errorCtx.action), expected, reverseIdx, + perpetrator.display() + ) + + companion object { + @JvmStatic + fun ofType(perpetrator: Iota, reverseIdx: Int, name: String): MishapInvalidIota { + return of(perpetrator, reverseIdx, "class.$name") + } + + @JvmStatic + fun of(perpetrator: Iota, reverseIdx: Int, name: String, vararg translations: Any): MishapInvalidIota { + val key = "hexcasting.mishap.invalid_value.$name" + return MishapInvalidIota(perpetrator, reverseIdx, key.asTranslatedComponent(*translations)) + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidPattern.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidPattern.kt new file mode 100644 index 00000000..f1bee32a --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidPattern.kt @@ -0,0 +1,22 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.casting.ResolvedPatternType +import at.petrak.hexcasting.api.spell.iota.GarbageIota +import at.petrak.hexcasting.api.spell.iota.Iota +import net.minecraft.world.item.DyeColor + +class MishapInvalidPattern : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.YELLOW) + + override fun resolutionType(ctx: CastingContext) = ResolvedPatternType.INVALID + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + stack.add(GarbageIota()) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("invalid_pattern") +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidSpellDatumType.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidSpellDatumType.kt new file mode 100644 index 00000000..49ea0825 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapInvalidSpellDatumType.kt @@ -0,0 +1,21 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.world.item.DyeColor + +/** + * this is bad + */ +class MishapInvalidSpellDatumType(val perpetrator: Any) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLACK) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + // NO-OP + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("invalid_spell_datum_type", this.perpetrator.toString(), this.perpetrator.javaClass.typeName) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationInWrongDimension.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationInWrongDimension.kt new file mode 100644 index 00000000..865036da --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationInWrongDimension.kt @@ -0,0 +1,24 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.GarbageIota +import at.petrak.hexcasting.api.spell.iota.Iota +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.item.DyeColor + +class MishapLocationInWrongDimension(val properDimension: ResourceLocation) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.MAGENTA) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + stack.add(GarbageIota()) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context): Component = + error( + "wrong_dimension", actionName(errorCtx.action!!), properDimension.toString(), + ctx.world.dimension().location().toString() + ) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationTooFarAway.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationTooFarAway.kt new file mode 100644 index 00000000..f22a4dcf --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapLocationTooFarAway.kt @@ -0,0 +1,21 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.Vec3Iota +import net.minecraft.network.chat.Component +import net.minecraft.world.item.DyeColor +import net.minecraft.world.phys.Vec3 + +class MishapLocationTooFarAway(val location: Vec3, val type: String = "too_far") : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.MAGENTA) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + yeetHeldItemsTowards(ctx, location) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context): Component = + error("location_$type", Vec3Iota.display(location), actionName(errorCtx.action)) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoAkashicRecord.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoAkashicRecord.kt new file mode 100644 index 00000000..66a323f2 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoAkashicRecord.kt @@ -0,0 +1,19 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.core.BlockPos +import net.minecraft.world.item.DyeColor + +class MishapNoAkashicRecord(val pos: BlockPos) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.PURPLE) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + ctx.caster.giveExperiencePoints(-100) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("no_akashic_record", pos.toShortString()) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoSpellCircle.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoSpellCircle.kt new file mode 100644 index 00000000..35726671 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNoSpellCircle.kt @@ -0,0 +1,35 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.Iota +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.enchantment.EnchantmentHelper + +class MishapNoSpellCircle : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.LIGHT_BLUE) + + private inline fun dropAll(player: Player, stacks: MutableList, filter: (ItemStack) -> Boolean = { true }) { + for (index in stacks.indices) { + val item = stacks[index] + if (!item.isEmpty && filter(item)) { + player.drop(item, true, false) + stacks[index] = ItemStack.EMPTY + } + } + } + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + dropAll(ctx.caster, ctx.caster.inventory.items) + dropAll(ctx.caster, ctx.caster.inventory.offhand) + dropAll(ctx.caster, ctx.caster.inventory.armor) { + !EnchantmentHelper.hasBindingCurse(it) + } + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("no_spell_circle", actionName(errorCtx.action)) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNotEnoughArgs.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNotEnoughArgs.kt new file mode 100644 index 00000000..e94b1542 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapNotEnoughArgs.kt @@ -0,0 +1,22 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.GarbageIota +import at.petrak.hexcasting.api.spell.iota.Iota +import net.minecraft.world.item.DyeColor + +class MishapNotEnoughArgs(val expected: Int, val got: Int) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.LIGHT_GRAY) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + repeat(expected - got) { stack.add(GarbageIota()) } + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + if (got == 0) + error("no_args", actionName(errorCtx.action), expected) + else + error("not_enough_args", actionName(errorCtx.action), expected, got) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapOthersName.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapOthersName.kt new file mode 100644 index 00000000..fa2e16b4 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapOthersName.kt @@ -0,0 +1,58 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.EntityIota +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.ListIota +import net.minecraft.world.effect.MobEffectInstance +import net.minecraft.world.effect.MobEffects +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.DyeColor + +/** + * Also throwable for your *own* name, for cases like Chronicler's Gambit + */ +class MishapOthersName(val confidant: Player) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLACK) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + val seconds = if (this.confidant == ctx.caster) 5 else 60; + ctx.caster.addEffect(MobEffectInstance(MobEffects.BLINDNESS, seconds * 20)) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + if (this.confidant == ctx.caster) + error("others_name.self") + else + error("others_name", confidant.name) + + companion object { + /** + * Return any true names found in this iota. + * + * If `caster` is non-null, it will ignore that when checking. + */ + @JvmStatic + fun getTrueNameFromDatum(datum: Iota, caster: Player?): Player? { + val poolToSearch = ArrayDeque() + poolToSearch.addLast(datum) + + while (poolToSearch.isNotEmpty()) { + val datumToCheck = poolToSearch.removeFirst() + if (datumToCheck is EntityIota && datumToCheck.entity is Player && datumToCheck.entity != caster) + return datumToCheck.entity as Player + if (datumToCheck is ListIota) + poolToSearch.addAll(datumToCheck.list) + } + + return null + } + + @JvmStatic + fun getTrueNameFromArgs(datums: List, caster: Player): Player? { + return datums.firstNotNullOfOrNull { getTrueNameFromDatum(it, caster) } + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapShameOnYou.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapShameOnYou.kt new file mode 100644 index 00000000..8700cedf --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapShameOnYou.kt @@ -0,0 +1,18 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.misc.HexDamageSources +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.Iota +import net.minecraft.world.item.DyeColor + +class MishapShameOnYou() : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.BLACK) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + Mishap.trulyHurt(ctx.caster, HexDamageSources.SHAME, 69420f) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = error("shame") +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapTooManyCloseParens.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapTooManyCloseParens.kt new file mode 100644 index 00000000..5420d090 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapTooManyCloseParens.kt @@ -0,0 +1,20 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.casting.CastingContext +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.PatternIota +import net.minecraft.world.item.DyeColor + +class MishapTooManyCloseParens : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.ORANGE) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + // TODO this is a kinda shitty mishap + stack.add(PatternIota(errorCtx.pattern)) + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("too_many_close_parens") +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapUnescapedValue.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapUnescapedValue.kt new file mode 100644 index 00000000..f952f6d0 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/spell/mishaps/MishapUnescapedValue.kt @@ -0,0 +1,35 @@ +package at.petrak.hexcasting.api.spell.mishaps + +import at.petrak.hexcasting.api.misc.FrozenColorizer +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.casting.CastingContext +import net.minecraft.world.item.DyeColor + +/** + * The value was a naked iota without being Considered or Retrospected. + */ +class MishapUnescapedValue( + val perpetrator: Iota +) : Mishap() { + override fun accentColor(ctx: CastingContext, errorCtx: Context): FrozenColorizer = + dyeColor(DyeColor.GRAY) + + override fun execute(ctx: CastingContext, errorCtx: Context, stack: MutableList) { + // TODO + /* + val idx = stack.indexOfLast { it.getType() == DatumType.LIST } + if (idx != -1) { + val list = stack[idx].payload as SpellList + val idxOfIota = list.indexOfFirst { it == perpetrator } + if (idxOfIota != -1) { + stack[idx] = SpellDatum.make(list.modifyAt(idxOfIota) { + SpellList.LPair(SpellDatum.make(Widget.GARBAGE), it.cdr) + }) + } + } + */ + } + + override fun errorMessage(ctx: CastingContext, errorCtx: Context) = + error("unescaped", perpetrator.display()) +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt new file mode 100644 index 00000000..7f65b885 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt @@ -0,0 +1,274 @@ +@file:JvmName("HexUtils") + +package at.petrak.hexcasting.api.utils + +import at.petrak.hexcasting.api.spell.iota.Iota +import at.petrak.hexcasting.api.spell.iota.ListIota +import at.petrak.hexcasting.api.spell.math.HexCoord +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes +import net.minecraft.ChatFormatting +import net.minecraft.nbt.* +import net.minecraft.network.chat.Component +import net.minecraft.network.chat.MutableComponent +import net.minecraft.network.chat.Style +import net.minecraft.world.InteractionHand +import net.minecraft.world.item.ItemStack +import net.minecraft.world.phys.Vec2 +import net.minecraft.world.phys.Vec3 +import java.lang.ref.WeakReference +import java.util.* +import kotlin.math.absoluteValue +import kotlin.math.max +import kotlin.math.min +import kotlin.math.roundToInt +import kotlin.reflect.KProperty + +const val TAU = Math.PI * 2.0 +const val SQRT_3 = 1.7320508f + +fun Vec3.serializeToNBT(): LongArrayTag = + LongArrayTag(longArrayOf(this.x.toRawBits(), this.y.toRawBits(), this.z.toRawBits())) + +fun vecFromNBT(tag: LongArray): Vec3 = if (tag.size != 3) Vec3.ZERO else + Vec3( + Double.fromBits(tag[0]), + Double.fromBits(tag[1]), + Double.fromBits(tag[2]) + ) + +fun Vec2.serializeToNBT(): LongArrayTag = + LongArrayTag(longArrayOf(this.x.toDouble().toRawBits(), this.y.toDouble().toRawBits())) + +fun vec2FromNBT(tag: LongArray): Vec2 = if (tag.size != 2) Vec2.ZERO else + Vec2( + Double.fromBits(tag[0]).toFloat(), + Double.fromBits(tag[1]).toFloat(), + ) + +fun otherHand(hand: InteractionHand) = + if (hand == InteractionHand.MAIN_HAND) InteractionHand.OFF_HAND else InteractionHand.MAIN_HAND + +fun fixNAN(n: Double): Double = if (n.isFinite()) n else 0.0 + +fun findCenter(points: List): Vec2 { + var minX = Float.POSITIVE_INFINITY + var minY = Float.POSITIVE_INFINITY + var maxX = Float.NEGATIVE_INFINITY + var maxY = Float.NEGATIVE_INFINITY + + for (pos in points) { + minX = min(minX, pos.x) + minY = min(minY, pos.y) + maxX = max(maxX, pos.x) + maxY = max(maxY, pos.y) + } + return Vec2( + (minX + maxX) / 2f, + (minY + maxY) / 2f + ) +} + +fun coordToPx(coord: HexCoord, size: Float, offset: Vec2): Vec2 = + Vec2( + SQRT_3 * coord.q.toFloat() + SQRT_3 / 2.0f * coord.r.toFloat(), + 1.5f * coord.r.toFloat() + ).scale(size).add(offset) + +fun pxToCoord(px: Vec2, size: Float, offset: Vec2): HexCoord { + val offsetted = px.add(offset.negated()) + var qf = (SQRT_3 / 3.0f * offsetted.x - 0.33333f * offsetted.y) / size + var rf = (0.66666f * offsetted.y) / size + + val q = qf.roundToInt() + val r = rf.roundToInt() + qf -= q + rf -= r + return if (q.absoluteValue >= r.absoluteValue) + HexCoord(q + (qf + 0.5f * rf).roundToInt(), r) + else + HexCoord(q, r + (rf + 0.5 * qf).roundToInt()) +} + +@JvmOverloads +fun > Array.getSafe(key: String, default: T = this[0]): T { + val lowercaseKey = key.lowercase(Locale.ROOT) + return firstOrNull { it.name.lowercase(Locale.ROOT) == lowercaseKey } ?: default +} + +@JvmOverloads +fun > Array.getSafe(index: Byte, default: T = this[0]) = getSafe(index.toInt(), default) + +@JvmOverloads +fun > Array.getSafe(index: Int, default: T = this[0]) = if (index in indices) this[index] else default + +fun String.withStyle(op: (Style) -> Style): MutableComponent = asTextComponent.withStyle(op) +fun String.withStyle(style: Style): MutableComponent = asTextComponent.withStyle(style) +fun String.withStyle(formatting: ChatFormatting): MutableComponent = asTextComponent.withStyle(formatting) +fun String.withStyle(vararg formatting: ChatFormatting): MutableComponent = asTextComponent.withStyle(*formatting) + +infix fun String.styledWith(op: (Style) -> Style) = withStyle(op) +infix fun String.styledWith(style: Style) = withStyle(style) +infix fun String.styledWith(formatting: ChatFormatting) = withStyle(formatting) + +infix fun MutableComponent.styledWith(op: (Style) -> Style): MutableComponent = withStyle(op) +infix fun MutableComponent.styledWith(style: Style): MutableComponent = withStyle(style) +infix fun MutableComponent.styledWith(formatting: ChatFormatting): MutableComponent = withStyle(formatting) + +val String.black get() = this styledWith ChatFormatting.BLACK +val MutableComponent.black get() = this styledWith ChatFormatting.BLACK + +val String.darkBlue get() = this styledWith ChatFormatting.DARK_BLUE +val MutableComponent.darkBlue get() = this styledWith ChatFormatting.DARK_BLUE + +val String.darkGreen get() = this styledWith ChatFormatting.DARK_GREEN +val MutableComponent.darkGreen get() = this styledWith ChatFormatting.DARK_GREEN + +val String.darkAqua get() = this styledWith ChatFormatting.DARK_AQUA +val MutableComponent.darkAqua get() = this styledWith ChatFormatting.DARK_AQUA + +val String.darkRed get() = this styledWith ChatFormatting.DARK_RED +val MutableComponent.darkRed get() = this styledWith ChatFormatting.DARK_RED + +val String.darkPurple get() = this styledWith ChatFormatting.DARK_PURPLE +val MutableComponent.darkPurple get() = this styledWith ChatFormatting.DARK_PURPLE + +val String.gold get() = this styledWith ChatFormatting.GOLD +val MutableComponent.gold get() = this styledWith ChatFormatting.GOLD + +val String.gray get() = this styledWith ChatFormatting.GRAY +val MutableComponent.gray get() = this styledWith ChatFormatting.GRAY + +val String.darkGray get() = this styledWith ChatFormatting.DARK_GRAY +val MutableComponent.darkGray get() = this styledWith ChatFormatting.DARK_GRAY + +val String.blue get() = this styledWith ChatFormatting.BLUE +val MutableComponent.blue get() = this styledWith ChatFormatting.BLUE + +val String.green get() = this styledWith ChatFormatting.GREEN +val MutableComponent.green get() = this styledWith ChatFormatting.GREEN + +val String.aqua get() = this styledWith ChatFormatting.AQUA +val MutableComponent.aqua get() = this styledWith ChatFormatting.AQUA + +val String.red get() = this styledWith ChatFormatting.RED +val MutableComponent.red get() = this styledWith ChatFormatting.RED + +val String.lightPurple get() = this styledWith ChatFormatting.LIGHT_PURPLE +val MutableComponent.lightPurple get() = this styledWith ChatFormatting.LIGHT_PURPLE + +val String.yellow get() = this styledWith ChatFormatting.YELLOW +val MutableComponent.yellow get() = this styledWith ChatFormatting.YELLOW + +val String.white get() = this styledWith ChatFormatting.WHITE +val MutableComponent.white get() = this styledWith ChatFormatting.WHITE + +val String.obfuscated get() = this styledWith ChatFormatting.OBFUSCATED +val MutableComponent.obfuscated get() = this styledWith ChatFormatting.OBFUSCATED + +val String.bold get() = this styledWith ChatFormatting.BOLD +val MutableComponent.bold get() = this styledWith ChatFormatting.BOLD + +val String.strikethrough get() = this styledWith ChatFormatting.STRIKETHROUGH +val MutableComponent.strikethrough get() = this styledWith ChatFormatting.STRIKETHROUGH + +val String.underline get() = this styledWith ChatFormatting.UNDERLINE +val MutableComponent.underline get() = this styledWith ChatFormatting.UNDERLINE + +val String.italic get() = this styledWith ChatFormatting.ITALIC +val MutableComponent.italic get() = this styledWith ChatFormatting.ITALIC + +operator fun MutableComponent.plusAssign(component: Component) { + append(component) +} + +val String.asTextComponent: MutableComponent get() = Component.literal(this) +val String.asTranslatedComponent: MutableComponent get() = Component.translatable(this) + +fun String.asTranslatedComponent(vararg args: Any): MutableComponent = Component.translatable(this, *args) + +/** + * Represents a value that the garbage collector is still allowed to collect. + * To create an instance of a [WeakValue], use [weakReference] or [weakMapped]. + */ +interface WeakValue { + var value: T? +} + +/** + * A weakly referenced value that relies directly on a [WeakReference]. + * + * This means that if there are no other places where the contained object is referenced, + * the reference will expire, and value contained within this reference will become null. + */ +private class WeakReferencedValue(var reference: WeakReference?) : WeakValue { + override var value: T? + get() = reference?.get() + set(value) { + reference = value?.let(::WeakReference) + } +} + +/** + * A weakly referenced value that relies on a [WeakHashMap]. + * + * Unlike [WeakReferencedValue], it relies on the continued existence of something else (obtained by [keyGen]). + * For example, this can be used to hold an entity, and have the reference expire when the world it's in is unloaded. + */ +private class WeakMappedValue(val keyGen: (T) -> K) : WeakValue { + val reference = WeakHashMap() + override var value: T? + get() = reference.values.firstOrNull() + set(value) { + reference.clear() + if (value != null) reference[keyGen(value)] = value + } +} + +/** + * Creates a [WeakReferencedValue], the contents of which will expire when nothing else is referencing them. + */ +fun weakReference(value: T? = null): WeakValue = WeakReferencedValue(value?.let { WeakReference(it) }) + +/** + * Creates a [WeakMappedValue], the contents of which will expire when nothing else is referencing the value returned by [keyGen]. + */ +fun weakMapped(keyGen: (T) -> K): WeakValue = WeakMappedValue(keyGen) + +// kt boilerplate for making WeakValues work as delegates (using the keyword `by`) +@Suppress("NOTHING_TO_INLINE") +inline operator fun WeakValue.getValue(thisRef: Any?, property: KProperty<*>): T? = value + +@Suppress("NOTHING_TO_INLINE") +inline operator fun WeakValue.setValue(thisRef: Any?, property: KProperty<*>, value: T?) { + this.value = value +} + +/** + * Returns an empty list if it's too complicated. + */ +fun Iterable.serializeToNBT() = + if (HexIotaTypes.isTooLargeToSerialize(this)) + ListTag() + else + ListIota(this.toList()).serialize() + +// Copy the impl from forge +fun ItemStack.serializeToNBT(): CompoundTag { + val out = CompoundTag() + this.save(out) + return out +} + +@Suppress("UNCHECKED_CAST") +@Throws(IllegalArgumentException::class) +fun Tag.downcast(type: TagType): T { + if (this.type == type) { + return this as T + } else { + throw IllegalArgumentException( + "Expected this tag to be of type ${type.name}, but found ${this.type.name}." + ) + } +} + +const val ERROR_COLOR = 0xff_f800f8.toInt() diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/MediaHelper.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/MediaHelper.kt new file mode 100644 index 00000000..3ede2c14 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/MediaHelper.kt @@ -0,0 +1,89 @@ +@file:JvmName("MediaHelper") + +package at.petrak.hexcasting.api.utils + +import at.petrak.hexcasting.api.addldata.ADMediaHolder +import at.petrak.hexcasting.xplat.IXplatAbstractions +import net.minecraft.util.Mth +import net.minecraft.world.item.ItemStack +import kotlin.math.roundToInt + +fun isMediaItem(stack: ItemStack): Boolean { + val mediaHolder = IXplatAbstractions.INSTANCE.findMediaHolder(stack) ?: return false + if (!mediaHolder.canProvide()) + return false + return mediaHolder.withdrawMedia(-1, true) > 0 +} + +/** + * Extract [cost] media from [stack]. If [cost] is less than zero, extract all media instead. + * This may mutate [stack] (and may consume it) unless [simulate] is set. + * + * If [drainForBatteries] is false, this will only consider forms of media that can be used to make new batteries. + * + * Return the amount of media extracted. This may be over [cost] if media is wasted. + */ +@JvmOverloads +fun extractMedia( + stack: ItemStack, + cost: Int = -1, + drainForBatteries: Boolean = false, + simulate: Boolean = false +): Int { + val mediaHolder = IXplatAbstractions.INSTANCE.findMediaHolder(stack) ?: return 0 + + return extractMedia(mediaHolder, cost, drainForBatteries, simulate) +} + +/** + * Extract [cost] media from [holder]. If [cost] is less than zero, extract all media instead. + * This may mutate the stack underlying [holder] (and may consume it) unless [simulate] is set. + * + * If [drainForBatteries] is false, this will only consider forms of media that can be used to make new batteries. + * + * Return the amount of media extracted. This may be over [cost] if media is wasted. + */ +fun extractMedia( + holder: ADMediaHolder, + cost: Int = -1, + drainForBatteries: Boolean = false, + simulate: Boolean = false +): Int { + if (drainForBatteries && !holder.canConstructBattery()) + return 0 + + return holder.withdrawMedia(cost, simulate) +} + +/** + * Sorted from least important to most important + */ +fun compareMediaItem(aMedia: ADMediaHolder, bMedia: ADMediaHolder): Int { + val priority = aMedia.consumptionPriority - bMedia.consumptionPriority + if (priority != 0) + return priority + + return aMedia.withdrawMedia(-1, true) - bMedia.withdrawMedia(-1, true) +} + +fun mediaBarColor(media: Int, maxMedia: Int): Int { + val amt = if (maxMedia == 0) { + 0f + } else { + media.toFloat() / maxMedia.toFloat() + } + + val r = Mth.lerp(amt, 84f, 254f) + val g = Mth.lerp(amt, 57f, 203f) + val b = Mth.lerp(amt, 138f, 230f) + return Mth.color(r / 255f, g / 255f, b / 255f) +} + +fun mediaBarWidth(media: Int, maxMedia: Int): Int { + val amt = if (maxMedia == 0) { + 0f + } else { + media.toFloat() / maxMedia.toFloat() + } + return (13f * amt).roundToInt() +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTDsl.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTDsl.kt new file mode 100644 index 00000000..a7a315b7 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTDsl.kt @@ -0,0 +1,210 @@ +@file:Suppress("NOTHING_TO_INLINE") +package at.petrak.hexcasting.api.utils + +import net.minecraft.nbt.* + +// https://github.com/TeamWizardry/LibrarianLib/blob/9cfb2cf3e35685568942ad41395265a2edc27d30/modules/core/src/main/kotlin/com/teamwizardry/librarianlib/core/util/kotlin/NbtBuilder.kt + +@DslMarker +internal annotation class NBTDslMarker + +@NBTDslMarker +object NBTBuilder { + inline operator fun invoke(block: NbtCompoundBuilder.() -> Unit) = compound(block) + inline operator fun invoke(tag: CompoundTag, block: NbtCompoundBuilder.() -> Unit) = use(tag, block) + + inline fun use(tag: CompoundTag, block: NbtCompoundBuilder.() -> Unit): CompoundTag = + NbtCompoundBuilder(tag).apply(block).tag + + inline fun compound(block: NbtCompoundBuilder.() -> Unit): CompoundTag = + NbtCompoundBuilder(CompoundTag()).apply(block).tag + + inline fun list(block: NbtListBuilder.() -> Unit): ListTag = + NbtListBuilder(ListTag()).apply(block).tag + + inline fun list(vararg elements: Tag, block: NbtListBuilder.() -> Unit): ListTag = + NbtListBuilder(ListTag()).also { + it.addAll(elements.toList()) + it.block() + }.tag + + inline fun list(vararg elements: Tag): ListTag = ListTag().also { it.addAll(elements) } + inline fun list(elements: Collection): ListTag = ListTag().also { it.addAll(elements) } + inline fun list(elements: Collection, mapper: (T) -> Tag): ListTag = ListTag().also { it.addAll(elements.map(mapper)) } + + inline fun double(value: Number): DoubleTag = DoubleTag.valueOf(value.toDouble()) + inline fun float(value: Number): FloatTag = FloatTag.valueOf(value.toFloat()) + inline fun long(value: Number): LongTag = LongTag.valueOf(value.toLong()) + inline fun int(value: Number): IntTag = IntTag.valueOf(value.toInt()) + inline fun short(value: Number): ShortTag = ShortTag.valueOf(value.toShort()) + inline fun byte(value: Number): ByteTag = ByteTag.valueOf(value.toByte()) + + inline fun string(value: String): StringTag = StringTag.valueOf(value) + + inline fun byteArray(value: Collection): ByteArrayTag = ByteArrayTag(value.map { it.toByte() }) + inline fun byteArray(vararg value: Int): ByteArrayTag = ByteArrayTag(ByteArray(value.size) { value[it].toByte() }) + inline fun byteArray(vararg value: Byte): ByteArrayTag = ByteArrayTag(value) + inline fun byteArray(): ByteArrayTag = ByteArrayTag(byteArrayOf()) // avoiding overload ambiguity + inline fun longArray(value: Collection): LongArrayTag = LongArrayTag(value.map { it.toLong() }) + inline fun longArray(vararg value: Int): LongArrayTag = LongArrayTag(LongArray(value.size) { value[it].toLong() }) + inline fun longArray(vararg value: Long): LongArrayTag = LongArrayTag(value) + inline fun longArray(): LongArrayTag = LongArrayTag(longArrayOf()) // avoiding overload ambiguity + inline fun intArray(value: Collection): IntArrayTag = IntArrayTag(value.map { it.toInt() }) + inline fun intArray(vararg value: Int): IntArrayTag = IntArrayTag(value) +} + +@JvmInline +@NBTDslMarker +value class NbtCompoundBuilder(val tag: CompoundTag) { + // configuring this tag + + inline operator fun String.remAssign(nbt: Tag) { + tag.put(this, nbt) + } + + inline operator fun String.remAssign(str: String) { + tag.put(this, string(str)) + } + + inline operator fun String.remAssign(num: Int) { + tag.put(this, int(num)) + } + + inline operator fun String.remAssign(num: Double) { + tag.put(this, double(num)) + } + + inline operator fun String.remAssign(num: Float) { + tag.put(this, float(num)) + } + + inline operator fun String.remAssign(bool: Boolean) { + tag.put(this, byte(if (bool) 1 else 0)) + } + + // creating new tags + + inline fun compound(block: NbtCompoundBuilder.() -> Unit): CompoundTag = + NbtCompoundBuilder(CompoundTag()).apply(block).tag + + inline fun list(block: NbtListBuilder.() -> Unit): ListTag = + NbtListBuilder(ListTag()).apply(block).tag + + inline fun list(vararg elements: Tag, block: NbtListBuilder.() -> Unit): ListTag = + NbtListBuilder(ListTag()).also { + it.addAll(elements.toList()) + it.block() + }.tag + + inline fun list(vararg elements: Tag): ListTag = ListTag().also { it.addAll(elements) } + inline fun list(elements: Collection): ListTag = ListTag().also { it.addAll(elements) } + inline fun list(elements: Collection, mapper: (T) -> Tag): ListTag = ListTag().also { it.addAll(elements.map(mapper)) } + + inline fun double(value: Number): DoubleTag = DoubleTag.valueOf(value.toDouble()) + inline fun float(value: Number): FloatTag = FloatTag.valueOf(value.toFloat()) + inline fun long(value: Number): LongTag = LongTag.valueOf(value.toLong()) + inline fun int(value: Number): IntTag = IntTag.valueOf(value.toInt()) + inline fun short(value: Number): ShortTag = ShortTag.valueOf(value.toShort()) + inline fun byte(value: Number): ByteTag = ByteTag.valueOf(value.toByte()) + + inline fun string(value: String): StringTag = StringTag.valueOf(value) + + inline fun byteArray(value: Collection): ByteArrayTag = ByteArrayTag(value.map { it.toByte() }) + inline fun byteArray(vararg value: Int): ByteArrayTag = ByteArrayTag(ByteArray(value.size) { value[it].toByte() }) + inline fun byteArray(vararg value: Byte): ByteArrayTag = ByteArrayTag(value) + inline fun byteArray(): ByteArrayTag = ByteArrayTag(byteArrayOf()) // avoiding overload ambiguity + inline fun longArray(value: Collection): LongArrayTag = LongArrayTag(value.map { it.toLong() }) + inline fun longArray(vararg value: Int): LongArrayTag = LongArrayTag(LongArray(value.size) { value[it].toLong() }) + inline fun longArray(vararg value: Long): LongArrayTag = LongArrayTag(value) + inline fun longArray(): LongArrayTag = LongArrayTag(longArrayOf()) // avoiding overload ambiguity + inline fun intArray(value: Collection): IntArrayTag = IntArrayTag(value.map { it.toInt() }) + inline fun intArray(vararg value: Int): IntArrayTag = IntArrayTag(value) +} + +@JvmInline +@NBTDslMarker +value class NbtListBuilder(val tag: ListTag) { + // configuring this tag + + /** + * Add the given tag to this list + */ + inline operator fun Tag.unaryPlus() { + tag.add(this) + } + + /** + * Add the given tags to this list + */ + inline operator fun Collection.unaryPlus() { + tag.addAll(this) + } + + /** + * Add the given tag to this list. This is explicitly defined for [ListTag] because otherwise there is overload + * ambiguity between the [Tag] and [Collection] methods. + */ + inline operator fun ListTag.unaryPlus() { + tag.add(this) + } + + inline fun addAll(nbt: Collection) { + this.tag.addAll(nbt) + } + + inline fun add(nbt: Tag) { + this.tag.add(nbt) + } + + // creating new tags + + inline fun compound(block: NbtCompoundBuilder.() -> Unit): CompoundTag = + NbtCompoundBuilder(CompoundTag()).apply(block).tag + + inline fun list(block: NbtListBuilder.() -> Unit): ListTag = + NbtListBuilder(ListTag()).apply(block).tag + + inline fun list(vararg elements: Tag, block: NbtListBuilder.() -> Unit): ListTag = + NbtListBuilder(ListTag()).also { + it.addAll(elements.toList()) + it.block() + }.tag + + inline fun list(vararg elements: Tag): ListTag = ListTag().also { it.addAll(elements) } + inline fun list(elements: Collection): ListTag = ListTag().also { it.addAll(elements) } + inline fun list(elements: Collection, mapper: (T) -> Tag): ListTag = ListTag().also { it.addAll(elements.map(mapper)) } + + inline fun double(value: Number): DoubleTag = DoubleTag.valueOf(value.toDouble()) + inline fun float(value: Number): FloatTag = FloatTag.valueOf(value.toFloat()) + inline fun long(value: Number): LongTag = LongTag.valueOf(value.toLong()) + inline fun int(value: Number): IntTag = IntTag.valueOf(value.toInt()) + inline fun short(value: Number): ShortTag = ShortTag.valueOf(value.toShort()) + inline fun byte(value: Number): ByteTag = ByteTag.valueOf(value.toByte()) + + inline fun string(value: String): StringTag = StringTag.valueOf(value) + + inline fun byteArray(value: Collection): ByteArrayTag = ByteArrayTag(value.map { it.toByte() }) + inline fun byteArray(vararg value: Int): ByteArrayTag = ByteArrayTag(ByteArray(value.size) { value[it].toByte() }) + inline fun byteArray(vararg value: Byte): ByteArrayTag = ByteArrayTag(value) + inline fun byteArray(): ByteArrayTag = ByteArrayTag(byteArrayOf()) // avoiding overload ambiguity + inline fun longArray(value: Collection): LongArrayTag = LongArrayTag(value.map { it.toLong() }) + inline fun longArray(vararg value: Int): LongArrayTag = LongArrayTag(LongArray(value.size) { value[it].toLong() }) + inline fun longArray(vararg value: Long): LongArrayTag = LongArrayTag(value) + inline fun longArray(): LongArrayTag = LongArrayTag(longArrayOf()) // avoiding overload ambiguity + inline fun intArray(value: Collection): IntArrayTag = IntArrayTag(value.map { it.toInt() }) + inline fun intArray(vararg value: Int): IntArrayTag = IntArrayTag(value) + + inline fun doubles(vararg value: Int): List = value.map { DoubleTag.valueOf(it.toDouble()) } + inline fun doubles(vararg value: Double): List = value.map { DoubleTag.valueOf(it) } + inline fun floats(vararg value: Int): List = value.map { FloatTag.valueOf(it.toFloat()) } + inline fun floats(vararg value: Float): List = value.map { FloatTag.valueOf(it) } + inline fun longs(vararg value: Int): List = value.map { LongTag.valueOf(it.toLong()) } + inline fun longs(vararg value: Long): List = value.map { LongTag.valueOf(it) } + inline fun ints(vararg value: Int): List = value.map { IntTag.valueOf(it) } + inline fun shorts(vararg value: Int): List = value.map { ShortTag.valueOf(it.toShort()) } + inline fun shorts(vararg value: Short): List = value.map { ShortTag.valueOf(it) } + inline fun bytes(vararg value: Int): List = value.map { ByteTag.valueOf(it.toByte()) } + inline fun bytes(vararg value: Byte): List = value.map { ByteTag.valueOf(it) } + + fun strings(vararg value: String): List = value.map { StringTag.valueOf(it) } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt new file mode 100644 index 00000000..ef9a757c --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt @@ -0,0 +1,273 @@ +@file:JvmName("NBTHelper") + +package at.petrak.hexcasting.api.utils + +import net.minecraft.nbt.* +import net.minecraft.world.item.ItemStack +import java.util.* + +private inline fun T?.getIf(key: K, predicate: T?.(K) -> Boolean, get: T.(K) -> E): E? = + getIf(key, predicate, get, null) + +private inline fun T?.getIf(key: K, predicate: T?.(K) -> Boolean, get: T.(K) -> E, default: E): E { + if (this != null && predicate(key)) + return get(key) + return default +} + +// ======================================================================================================== CompoundTag + +// Checks for containment + +fun CompoundTag?.hasNumber(key: String) = contains(key, Tag.TAG_ANY_NUMERIC) +fun CompoundTag?.hasByte(key: String) = contains(key, Tag.TAG_BYTE) +fun CompoundTag?.hasShort(key: String) = contains(key, Tag.TAG_SHORT) +fun CompoundTag?.hasInt(key: String) = contains(key, Tag.TAG_INT) +fun CompoundTag?.hasLong(key: String) = contains(key, Tag.TAG_LONG) +fun CompoundTag?.hasFloat(key: String) = contains(key, Tag.TAG_FLOAT) +fun CompoundTag?.hasDouble(key: String) = contains(key, Tag.TAG_DOUBLE) +fun CompoundTag?.hasLongArray(key: String) = contains(key, Tag.TAG_LONG_ARRAY) +fun CompoundTag?.hasIntArray(key: String) = contains(key, Tag.TAG_INT_ARRAY) +fun CompoundTag?.hasByteArray(key: String) = contains(key, Tag.TAG_BYTE_ARRAY) +fun CompoundTag?.hasCompound(key: String) = contains(key, Tag.TAG_COMPOUND) +fun CompoundTag?.hasString(key: String) = contains(key, Tag.TAG_STRING) +fun CompoundTag?.hasList(key: String) = contains(key, Tag.TAG_LIST) +fun CompoundTag?.hasList(key: String, objType: Int) = hasList(key, objType.toByte()) +fun CompoundTag?.hasList(key: String, objType: Byte): Boolean { + if (!hasList(key)) return false + val lt = get(key) as ListTag + return lt.elementType == objType || lt.elementType == 0.toByte() +} + +fun CompoundTag?.hasUUID(key: String) = this != null && hasUUID(key) + +fun CompoundTag?.contains(key: String, id: Byte) = contains(key, id.toInt()) +fun CompoundTag?.contains(key: String, id: Int) = this != null && contains(key, id) +fun CompoundTag?.contains(key: String) = this != null && contains(key) + +// Puts + +fun CompoundTag?.putBoolean(key: String, value: Boolean) = this?.putBoolean(key, value) +fun CompoundTag?.putByte(key: String, value: Byte) = this?.putByte(key, value) +fun CompoundTag?.putShort(key: String, value: Short) = this?.putShort(key, value) +fun CompoundTag?.putInt(key: String, value: Int) = this?.putInt(key, value) +fun CompoundTag?.putLong(key: String, value: Long) = this?.putLong(key, value) +fun CompoundTag?.putFloat(key: String, value: Float) = this?.putFloat(key, value) +fun CompoundTag?.putDouble(key: String, value: Double) = this?.putDouble(key, value) +fun CompoundTag?.putLongArray(key: String, value: LongArray) = this?.putLongArray(key, value) +fun CompoundTag?.putIntArray(key: String, value: IntArray) = this?.putIntArray(key, value) +fun CompoundTag?.putByteArray(key: String, value: ByteArray) = this?.putByteArray(key, value) +fun CompoundTag?.putCompound(key: String, value: CompoundTag) = put(key, value) +fun CompoundTag?.putString(key: String, value: String) = this?.putString(key, value) +fun CompoundTag?.putList(key: String, value: ListTag) = put(key, value) +fun CompoundTag?.putUUID(key: String, value: UUID) = this?.putUUID(key, value) +fun CompoundTag?.put(key: String, value: Tag) = this?.put(key, value) + +// Remove + +fun CompoundTag?.remove(key: String) = this?.remove(key) + +// Gets + +@JvmOverloads +fun CompoundTag?.getBoolean(key: String, defaultExpected: Boolean = false) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getBoolean, defaultExpected) + +@JvmOverloads +fun CompoundTag?.getByte(key: String, defaultExpected: Byte = 0) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getByte, defaultExpected) + +@JvmOverloads +fun CompoundTag?.getShort(key: String, defaultExpected: Short = 0) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getShort, defaultExpected) + +@JvmOverloads +fun CompoundTag?.getInt(key: String, defaultExpected: Int = 0) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getInt, defaultExpected) + +@JvmOverloads +fun CompoundTag?.getLong(key: String, defaultExpected: Long = 0) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getLong, defaultExpected) + +@JvmOverloads +fun CompoundTag?.getFloat(key: String, defaultExpected: Float = 0f) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getFloat, defaultExpected) + +@JvmOverloads +fun CompoundTag?.getDouble(key: String, defaultExpected: Double = 0.0) = + getIf(key, CompoundTag?::hasNumber, CompoundTag::getDouble, defaultExpected) + +fun CompoundTag?.getLongArray(key: String) = getIf(key, CompoundTag?::hasLongArray, CompoundTag::getLongArray) +fun CompoundTag?.getIntArray(key: String) = getIf(key, CompoundTag?::hasIntArray, CompoundTag::getIntArray) +fun CompoundTag?.getByteArray(key: String) = getIf(key, CompoundTag?::hasByteArray, CompoundTag::getByteArray) +fun CompoundTag?.getCompound(key: String): CompoundTag? = + getIf(key, CompoundTag?::hasCompound, CompoundTag::getCompound) + +fun CompoundTag?.getString(key: String) = getIf(key, CompoundTag?::hasString, CompoundTag::getString) +fun CompoundTag?.getList(key: String, objType: Byte) = getList(key, objType.toInt()) +fun CompoundTag?.getList(key: String, objType: Int) = getIf(key, { hasList(key, objType) }) { getList(it, objType) } +fun CompoundTag?.getUUID(key: String) = getIf(key, CompoundTag?::hasUUID, CompoundTag::getUUID) +fun CompoundTag?.get(key: String) = getIf(key, CompoundTag?::contains, CompoundTag::get) + +@JvmSynthetic +@JvmName("getListByByte") +fun CompoundTag.getList(key: String, objType: Byte): ListTag = getList(key, objType.toInt()) + +// Get-or-create + +fun CompoundTag.getOrCreateCompound(key: String): CompoundTag = getCompound(key) ?: CompoundTag().also { putCompound(key, it) } +fun CompoundTag.getOrCreateList(key: String, objType: Byte) = getOrCreateList(key, objType.toInt()) +fun CompoundTag.getOrCreateList(key: String, objType: Int): ListTag = if (hasList(key, objType)) getList(key, objType) else ListTag().also { putList(key, it) } + +// ================================================================================================================ Tag + +val Tag.asBoolean get() = asByte == 0.toByte() +val Tag.asByte get() = (this as? NumericTag)?.asByte ?: 0.toByte() +val Tag.asShort get() = (this as? NumericTag)?.asShort ?: 0.toShort() +val Tag.asInt get() = (this as? NumericTag)?.asInt ?: 0 +val Tag.asLong get() = (this as? NumericTag)?.asLong ?: 0L +val Tag.asFloat get() = (this as? NumericTag)?.asFloat ?: 0F +val Tag.asDouble get() = (this as? NumericTag)?.asDouble ?: 0.0 + +val Tag.asLongArray: LongArray + get() = when (this) { + is LongArrayTag -> this.asLongArray + is IntArrayTag -> { + val array = this.asIntArray + LongArray(array.size) { array[it].toLong() } + } + is ByteArrayTag -> { + val array = this.asByteArray + LongArray(array.size) { array[it].toLong() } + } + else -> LongArray(0) + } + +val Tag.asIntArray: IntArray + get() = when (this) { + is IntArrayTag -> this.asIntArray + is LongArrayTag -> { + val array = this.asLongArray + IntArray(array.size) { array[it].toInt() } + } + is ByteArrayTag -> { + val array = this.asByteArray + IntArray(array.size) { array[it].toInt() } + } + else -> IntArray(0) + } + +val Tag.asByteArray: ByteArray + get() = when (this) { + is ByteArrayTag -> this.asByteArray + is LongArrayTag -> { + val array = this.asLongArray + ByteArray(array.size) { array[it].toByte() } + } + is IntArrayTag -> { + val array = this.asIntArray + ByteArray(array.size) { array[it].toByte() } + } + else -> ByteArray(0) + } + +val Tag.asCompound get() = this as? CompoundTag ?: CompoundTag() + +// asString is defined in Tag +val Tag.asList get() = this as? ListTag ?: ListTag() +val Tag.asUUID: UUID get() = if (this is IntArrayTag && this.size == 4) NbtUtils.loadUUID(this) else UUID(0, 0) + +// ========================================================================================================== ItemStack + +// Checks for containment + +fun ItemStack.hasNumber(key: String) = tag.hasNumber(key) +fun ItemStack.hasByte(key: String) = tag.hasByte(key) +fun ItemStack.hasShort(key: String) = tag.hasShort(key) +fun ItemStack.hasInt(key: String) = tag.hasInt(key) +fun ItemStack.hasLong(key: String) = tag.hasLong(key) +fun ItemStack.hasFloat(key: String) = tag.hasFloat(key) +fun ItemStack.hasDouble(key: String) = tag.hasDouble(key) +fun ItemStack.hasLongArray(key: String) = tag.hasLongArray(key) +fun ItemStack.hasIntArray(key: String) = tag.hasIntArray(key) +fun ItemStack.hasByteArray(key: String) = tag.hasByteArray(key) +fun ItemStack.hasCompound(key: String) = tag.hasCompound(key) +fun ItemStack.hasString(key: String) = tag.hasString(key) +fun ItemStack.hasList(key: String) = tag.hasList(key) +fun ItemStack.hasList(key: String, objType: Int) = tag.hasList(key, objType) +fun ItemStack.hasList(key: String, objType: Byte) = tag.hasList(key, objType) +fun ItemStack.hasUUID(key: String) = tag.hasUUID(key) + +@JvmName("contains") +fun ItemStack.containsTag(key: String) = tag.contains(key) + +@JvmName("contains") +fun ItemStack.containsTag(key: String, id: Byte) = tag.contains(key, id) + +@JvmName("contains") +fun ItemStack.containsTag(key: String, id: Int) = tag.contains(key, id) + +// Puts + +fun ItemStack.putBoolean(key: String, value: Boolean) = orCreateTag.putBoolean(key, value) +fun ItemStack.putByte(key: String, value: Byte) = orCreateTag.putByte(key, value) +fun ItemStack.putShort(key: String, value: Short) = orCreateTag.putShort(key, value) +fun ItemStack.putInt(key: String, value: Int) = orCreateTag.putInt(key, value) +fun ItemStack.putLong(key: String, value: Long) = orCreateTag.putLong(key, value) +fun ItemStack.putFloat(key: String, value: Float) = orCreateTag.putFloat(key, value) +fun ItemStack.putDouble(key: String, value: Double) = orCreateTag.putDouble(key, value) + +fun ItemStack.putLongArray(key: String, value: LongArray) = orCreateTag.putLongArray(key, value) +fun ItemStack.putIntArray(key: String, value: IntArray) = orCreateTag.putIntArray(key, value) +fun ItemStack.putByteArray(key: String, value: ByteArray) = orCreateTag.putByteArray(key, value) +fun ItemStack.putCompound(key: String, value: CompoundTag) = putTag(key, value) +fun ItemStack.putString(key: String, value: String) = orCreateTag.putString(key, value) +fun ItemStack.putList(key: String, value: ListTag) = putTag(key, value) +fun ItemStack.putUUID(key: String, value: UUID) = orCreateTag.putUUID(key, value) + +@JvmName("put") +fun ItemStack.putTag(key: String, value: Tag) = orCreateTag.put(key, value) + +// Remove + +fun ItemStack.remove(key: String) = removeTagKey(key) + +// Gets + +@JvmOverloads +fun ItemStack.getBoolean(key: String, defaultExpected: Boolean = false) = tag.getBoolean(key, defaultExpected) + +@JvmOverloads +fun ItemStack.getByte(key: String, defaultExpected: Byte = 0) = tag.getByte(key, defaultExpected) + +@JvmOverloads +fun ItemStack.getShort(key: String, defaultExpected: Short = 0) = tag.getShort(key, defaultExpected) + +@JvmOverloads +fun ItemStack.getInt(key: String, defaultExpected: Int = 0) = tag.getInt(key, defaultExpected) + +@JvmOverloads +fun ItemStack.getLong(key: String, defaultExpected: Long = 0) = tag.getLong(key, defaultExpected) + +@JvmOverloads +fun ItemStack.getFloat(key: String, defaultExpected: Float = 0f) = tag.getFloat(key, defaultExpected) + +@JvmOverloads +fun ItemStack.getDouble(key: String, defaultExpected: Double = 0.0) = tag.getDouble(key, defaultExpected) + +fun ItemStack.getLongArray(key: String) = tag.getLongArray(key) +fun ItemStack.getIntArray(key: String) = tag.getIntArray(key) +fun ItemStack.getByteArray(key: String) = tag.getByteArray(key) +fun ItemStack.getCompound(key: String) = tag.getCompound(key) +fun ItemStack.getString(key: String) = tag.getString(key) +fun ItemStack.getList(key: String, objType: Int) = tag.getList(key, objType) +fun ItemStack.getUUID(key: String) = tag.getUUID(key) + +@JvmName("get") +fun ItemStack.getTag(key: String) = tag.get(key) + +// Get-or-create + +fun ItemStack.getOrCreateCompound(key: String): CompoundTag = getOrCreateTagElement(key) +fun ItemStack.getOrCreateList(key: String, objType: Byte) = orCreateTag.getOrCreateList(key, objType) +fun ItemStack.getOrCreateList(key: String, objType: Int) = orCreateTag.getOrCreateList(key, objType) diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/PatternNameHelper.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/PatternNameHelper.java new file mode 100644 index 00000000..1f05fc06 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/api/utils/PatternNameHelper.java @@ -0,0 +1,28 @@ +package at.petrak.hexcasting.api.utils; + +import at.petrak.hexcasting.api.PatternRegistry; +import at.petrak.hexcasting.api.spell.casting.SpecialPatterns; +import at.petrak.hexcasting.api.spell.iota.PatternIota; +import at.petrak.hexcasting.api.spell.math.HexPattern; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; + +public class PatternNameHelper { + + public static Component representationForPattern(HexPattern pattern) { + if (pattern.sigsEqual(SpecialPatterns.CONSIDERATION)) { + return Component.translatable("hexcasting.spell.hexcasting:escape").withStyle(ChatFormatting.LIGHT_PURPLE); + } else if (pattern.sigsEqual(SpecialPatterns.INTROSPECTION)) { + return Component.translatable("hexcasting.spell.hexcasting:open_paren").withStyle(ChatFormatting.LIGHT_PURPLE); + } else if (pattern.sigsEqual(SpecialPatterns.RETROSPECTION)) { + return Component.translatable("hexcasting.spell.hexcasting:close_paren").withStyle(ChatFormatting.LIGHT_PURPLE); + } + + var action = PatternRegistry.lookupPatternByShape(pattern); + if (action != null) { + return action.getDisplayName(); + } + + return new PatternIota(pattern).display(); // TODO: this should be merged into iota.display once Great Spells can be identified by name + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/ClientTickCounter.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/ClientTickCounter.java new file mode 100644 index 00000000..213b3433 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/ClientTickCounter.java @@ -0,0 +1,23 @@ +package at.petrak.hexcasting.client; + +import net.minecraft.client.Minecraft; + +public class ClientTickCounter { + public static long ticksInGame = 0L; + public static float partialTicks = 0.0F; + + public static float getTotal() { + return (float)ticksInGame + partialTicks; + } + + public static void renderTickStart(float renderTickTime) { + partialTicks = renderTickTime; + } + + public static void clientTickEnd() { + if (!Minecraft.getInstance().isPaused()) { + ++ticksInGame; + partialTicks = 0.0F; + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/HexAdditionalRenderers.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/HexAdditionalRenderers.java new file mode 100644 index 00000000..7817e966 --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/HexAdditionalRenderers.java @@ -0,0 +1,219 @@ +package at.petrak.hexcasting.client; + +import at.petrak.hexcasting.api.client.ScryingLensOverlayRegistry; +import at.petrak.hexcasting.api.misc.DiscoveryHandlers; +import at.petrak.hexcasting.api.player.Sentinel; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.datafixers.util.Pair; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.locale.Language; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.network.chat.Style; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +import java.util.List; +import java.util.function.BiConsumer; + +public class HexAdditionalRenderers { + public static void overlayLevel(PoseStack ps, float partialTick) { + var player = Minecraft.getInstance().player; + if (player != null) { + var sentinel = IXplatAbstractions.INSTANCE.getSentinel(player); + if (sentinel.hasSentinel() && player.getLevel().dimension().equals(sentinel.dimension())) { + renderSentinel(sentinel, player, ps, partialTick); + } + } + } + + public static void overlayGui(PoseStack ps, float partialTicks) { + tryRenderScryingLensOverlay(ps, partialTicks); + } + + private static void renderSentinel(Sentinel sentinel, LocalPlayer owner, + PoseStack ps, float partialTicks) { + ps.pushPose(); + + // zero vector is the player + var mc = Minecraft.getInstance(); + var camera = mc.gameRenderer.getMainCamera(); + var playerPos = camera.getPosition(); + ps.translate( + sentinel.position().x - playerPos.x, + sentinel.position().y - playerPos.y, + sentinel.position().z - playerPos.z); + + var time = ClientTickCounter.getTotal() / 2; + var bobSpeed = 1f / 20; + var magnitude = 0.1f; + ps.translate(0, Mth.sin(bobSpeed * time) * magnitude, 0); + var spinSpeed = 1f / 30; + ps.mulPose(Quaternion.fromXYZ(new Vector3f(0, spinSpeed * time, 0))); + if (sentinel.extendsRange()) { + ps.mulPose(Quaternion.fromXYZ(new Vector3f(spinSpeed * time / 8f, 0, 0))); + } + + float scale = 0.5f; + ps.scale(scale, scale, scale); + + + var tess = Tesselator.getInstance(); + var buf = tess.getBuilder(); + var neo = ps.last().pose(); + RenderSystem.enableBlend(); + RenderSystem.setShader(GameRenderer::getRendertypeLinesShader); + RenderSystem.disableDepthTest(); + RenderSystem.disableCull(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.lineWidth(5f); + + var colorizer = IXplatAbstractions.INSTANCE.getColorizer(owner); + BiConsumer v = (l, r) -> { + int lcolor = colorizer.getColor(time, new Vec3(l[0], l[1], l[2])), + rcolor = colorizer.getColor(time, new Vec3(r[0], r[1], r[2])); + var normal = new Vector3f(r[0] - l[0], r[1] - l[1], r[2] - l[2]); + normal.normalize(); + buf.vertex(neo, l[0], l[1], l[2]) + .color(lcolor) + .normal(ps.last().normal(), normal.x(), normal.y(), normal.z()) + .endVertex(); + buf.vertex(neo, r[0], r[1], r[2]) + .color(rcolor) + .normal(ps.last().normal(), -normal.x(), -normal.y(), -normal.z()) + .endVertex(); + }; + + // Icosahedron inscribed inside the unit sphere + buf.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + for (int side = 0; side <= 1; side++) { + var ring = (side == 0) ? Icos.BOTTOM_RING : Icos.TOP_RING; + var apex = (side == 0) ? Icos.BOTTOM : Icos.TOP; + + // top & bottom spider + for (int i = 0; i < 5; i++) { + v.accept(apex, ring[i]); + } + + // ring around + for (int i = 0; i < 5; i++) { + v.accept(ring[i % 5], ring[(i + 1) % 5]); + } + } + // center band + for (int i = 0; i < 5; i++) { + var bottom = Icos.BOTTOM_RING[i]; + v.accept(Icos.TOP_RING[(i + 2) % 5], bottom); + v.accept(bottom, Icos.TOP_RING[(i + 3) % 5]); + } + tess.end(); + + RenderSystem.enableDepthTest(); + RenderSystem.enableCull(); + ps.popPose(); + } + + private static class Icos { + public static float[] TOP = {0, 1, 0}; + public static float[] BOTTOM = {0, -1, 0}; + public static float[][] TOP_RING = new float[5][]; + public static float[][] BOTTOM_RING = new float[5][]; + + static { + var theta = (float) Mth.atan2(0.5, 1); + for (int i = 0; i < 5; i++) { + var phi = (float) i / 5f * Mth.TWO_PI; + var x = Mth.cos(theta) * Mth.cos(phi); + var y = Mth.sin(theta); + var z = Mth.cos(theta) * Mth.sin(phi); + TOP_RING[i] = new float[]{x, y, z}; + BOTTOM_RING[i] = new float[]{-x, -y, -z}; + } + } + } + + private static void tryRenderScryingLensOverlay(PoseStack ps, float partialTicks) { + var mc = Minecraft.getInstance(); + + LocalPlayer player = mc.player; + ClientLevel level = mc.level; + if (player == null || level == null) { + return; + } + + if (!DiscoveryHandlers.hasLens(player)) + return; + + var hitRes = mc.hitResult; + if (hitRes != null && hitRes.getType() == HitResult.Type.BLOCK) { + var bhr = (BlockHitResult) hitRes; + var pos = bhr.getBlockPos(); + var bs = level.getBlockState(pos); + + var lines = ScryingLensOverlayRegistry.getLines(bs, pos, player, level, bhr.getDirection()); + + int totalHeight = 8; + List>> actualLines = Lists.newArrayList(); + + var window = mc.getWindow(); + var maxWidth = (int) (window.getGuiScaledWidth() / 2f * 0.8f); + + for (var pair : lines) { + totalHeight += mc.font.lineHeight + 6; + var text = pair.getSecond(); + var textLines = mc.font.getSplitter().splitLines(text, maxWidth, Style.EMPTY); + + actualLines.add(Pair.of(pair.getFirst(), textLines)); + + if (textLines.size() > 1) { + totalHeight += mc.font.lineHeight * (textLines.size() - 1); + } + } + + if (!lines.isEmpty()) { + var x = window.getGuiScaledWidth() / 2f + 8f; + var y = window.getGuiScaledHeight() / 2f - totalHeight; + ps.pushPose(); + ps.translate(x, y, 0); + + for (var pair : actualLines) { + var stack = pair.getFirst(); + if (!stack.isEmpty()) { + // this draws centered in the Y ... + RenderLib.renderItemStackInGui(ps, pair.getFirst(), 0, 0); + } + float tx = stack.isEmpty() ? 0 : 18; + float ty = 5; + // but this draws where y=0 is the baseline + var text = pair.getSecond(); + + for (var line : text) { + var actualLine = Language.getInstance().getVisualOrder(line); + mc.font.drawShadow(ps, actualLine, tx, ty, 0xffffffff); + ps.translate(0, mc.font.lineHeight, 0); + } + if (text.isEmpty()) { + ps.translate(0, mc.font.lineHeight, 0); + } + ps.translate(0, 6, 0); + } + + ps.popPose(); + } + } + } +} diff --git a/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java b/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java new file mode 100644 index 00000000..09e66e6a --- /dev/null +++ b/0.10.3/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java @@ -0,0 +1,469 @@ +package at.petrak.hexcasting.client; + +import at.petrak.hexcasting.api.block.circle.BlockAbstractImpetus; +import at.petrak.hexcasting.api.block.circle.BlockEntityAbstractImpetus; +import at.petrak.hexcasting.api.client.ScryingLensOverlayRegistry; +import at.petrak.hexcasting.api.item.IotaHolderItem; +import at.petrak.hexcasting.api.item.MediaHolderItem; +import at.petrak.hexcasting.api.misc.MediaConstants; +import at.petrak.hexcasting.api.utils.NBTHelper; +import at.petrak.hexcasting.client.be.BlockEntityAkashicBookshelfRenderer; +import at.petrak.hexcasting.client.be.BlockEntitySlateRenderer; +import at.petrak.hexcasting.client.entity.WallScrollRenderer; +import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicBookshelf; +import at.petrak.hexcasting.common.blocks.akashic.BlockEntityAkashicBookshelf; +import at.petrak.hexcasting.common.entities.HexEntities; +import at.petrak.hexcasting.common.items.*; +import at.petrak.hexcasting.common.items.magic.ItemMediaBattery; +import at.petrak.hexcasting.common.items.magic.ItemPackagedHex; +import at.petrak.hexcasting.common.lib.HexBlockEntities; +import at.petrak.hexcasting.common.lib.HexBlocks; +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.xplat.IClientXplatAbstractions; +import com.mojang.datafixers.util.Pair; +import net.minecraft.ChatFormatting; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextColor; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.ComparatorMode; +import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; +import net.minecraft.world.level.block.state.properties.RailShape; +import net.minecraft.world.level.material.MaterialColor; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; +import java.util.function.BiConsumer; +import java.util.function.Predicate; +import java.util.function.ToIntFunction; +import java.util.function.UnaryOperator; + +public class RegisterClientStuff { + public static void init() { + registerDataHolderOverrides(HexItems.FOCUS, + stack -> HexItems.FOCUS.readIotaTag(stack) != null, + ItemFocus::isSealed); + registerDataHolderOverrides(HexItems.SPELLBOOK, + stack -> HexItems.SPELLBOOK.readIotaTag(stack) != null, + ItemSpellbook::isSealed); + + registerPackagedSpellOverrides(HexItems.CYPHER); + registerPackagedSpellOverrides(HexItems.TRINKET); + registerPackagedSpellOverrides(HexItems.ARTIFACT); + + var x = IClientXplatAbstractions.INSTANCE; + x.registerItemProperty(HexItems.BATTERY, ItemMediaBattery.MEDIA_PREDICATE, + (stack, level, holder, holderID) -> { + var item = (MediaHolderItem) stack.getItem(); + return item.getMediaFullness(stack); + }); + x.registerItemProperty(HexItems.BATTERY, ItemMediaBattery.MAX_MEDIA_PREDICATE, + (stack, level, holder, holderID) -> { + var item = (ItemMediaBattery) stack.getItem(); + var max = item.getMaxMedia(stack); + return (float) Math.sqrt((float) max / MediaConstants.CRYSTAL_UNIT / 10); + }); + + registerScrollOverrides(HexItems.SCROLL_SMOL); + registerScrollOverrides(HexItems.SCROLL_MEDIUM); + registerScrollOverrides(HexItems.SCROLL_LARGE); + + x.registerItemProperty(HexItems.SLATE, ItemSlate.WRITTEN_PRED, + (stack, level, holder, holderID) -> ItemSlate.hasPattern(stack) ? 1f : 0f); + + registerWandOverrides(HexItems.STAFF_OAK); + registerWandOverrides(HexItems.STAFF_BIRCH); + registerWandOverrides(HexItems.STAFF_SPRUCE); + registerWandOverrides(HexItems.STAFF_JUNGLE); + registerWandOverrides(HexItems.STAFF_DARK_OAK); + registerWandOverrides(HexItems.STAFF_ACACIA); + registerWandOverrides(HexItems.STAFF_EDIFIED); + + x.setRenderLayer(HexBlocks.CONJURED_LIGHT, RenderType.cutout()); + x.setRenderLayer(HexBlocks.CONJURED_BLOCK, RenderType.cutout()); + x.setRenderLayer(HexBlocks.EDIFIED_DOOR, RenderType.cutout()); + x.setRenderLayer(HexBlocks.EDIFIED_TRAPDOOR, RenderType.cutout()); + x.setRenderLayer(HexBlocks.AKASHIC_BOOKSHELF, RenderType.cutout()); + x.setRenderLayer(HexBlocks.SCONCE, RenderType.cutout()); + + x.setRenderLayer(HexBlocks.AMETHYST_EDIFIED_LEAVES, RenderType.cutoutMipped()); + x.setRenderLayer(HexBlocks.AVENTURINE_EDIFIED_LEAVES, RenderType.cutoutMipped()); + x.setRenderLayer(HexBlocks.CITRINE_EDIFIED_LEAVES, RenderType.cutoutMipped()); + + x.setRenderLayer(HexBlocks.AKASHIC_RECORD, RenderType.translucent()); + + x.registerEntityRenderer(HexEntities.WALL_SCROLL, WallScrollRenderer::new); + +// for (var tex : new ResourceLocation[]{ +// PatternTooltipComponent.PRISTINE_BG, +// PatternTooltipComponent.ANCIENT_BG, +// PatternTooltipComponent.SLATE_BG +// }) { +// Minecraft.getInstance().getTextureManager().bindForSetup(tex); +// } + + addScryingLensStuff(); + } + + public static void registerColorProviders(BiConsumer itemColorRegistry, + BiConsumer blockColorRegistry) { + itemColorRegistry.accept(makeIotaStorageColorizer(HexItems.FOCUS::getColor), HexItems.FOCUS); + itemColorRegistry.accept(makeIotaStorageColorizer(HexItems.SPELLBOOK::getColor), HexItems.SPELLBOOK); + + blockColorRegistry.accept((bs, level, pos, idx) -> { + if (!bs.getValue(BlockAkashicBookshelf.HAS_BOOKS) || level == null || pos == null) { + return 0xff_ffffff; + } + var tile = level.getBlockEntity(pos); + if (!(tile instanceof BlockEntityAkashicBookshelf beas)) { + // this gets called for particles for some irritating reason + return 0xff_ffffff; + } + var iotaTag = beas.getIotaTag(); + if (iotaTag == null) { + return 0xff_ffffff; + } + return HexIotaTypes.getColor(iotaTag); + }, HexBlocks.AKASHIC_BOOKSHELF); + } + + /** + * Helper function to colorize the layers of an item that stores an iota, in the manner of foci and spellbooks. + *
+ * 0 = base; 1 = overlay + */ + public static ItemColor makeIotaStorageColorizer(ToIntFunction getColor) { + return (stack, idx) -> { + if (idx == 1) { + return getColor.applyAsInt(stack); + } + return 0xff_ffffff; + }; + } + + private static void addScryingLensStuff() { + ScryingLensOverlayRegistry.addPredicateDisplayer( + (state, pos, observer, world, direction) -> state.getBlock() instanceof BlockAbstractImpetus, + (lines, state, pos, observer, world, direction) -> { + if (world.getBlockEntity(pos) instanceof BlockEntityAbstractImpetus beai) { + beai.applyScryingLensOverlay(lines, state, pos, observer, world, direction); + } + }); + + ScryingLensOverlayRegistry.addDisplayer(Blocks.NOTE_BLOCK, + (lines, state, pos, observer, world, direction) -> { + int note = state.getValue(NoteBlock.NOTE); + + float rCol = Math.max(0.0F, Mth.sin((note / 24F + 0.0F) * Mth.TWO_PI) * 0.65F + 0.35F); + float gCol = Math.max(0.0F, Mth.sin((note / 24F + 0.33333334F) * Mth.TWO_PI) * 0.65F + 0.35F); + float bCol = Math.max(0.0F, Mth.sin((note / 24F + 0.6666667F) * Mth.TWO_PI) * 0.65F + 0.35F); + + int noteColor = 0xFF_000000 | Mth.color(rCol, gCol, bCol); + + var instrument = state.getValue(NoteBlock.INSTRUMENT); + + lines.add(new Pair<>( + new ItemStack(Items.MUSIC_DISC_CHIRP), + Component.literal(String.valueOf(instrument.ordinal())) + .withStyle(color(instrumentColor(instrument))))); + lines.add(new Pair<>( + new ItemStack(Items.NOTE_BLOCK), + Component.literal(String.valueOf(note)) + .withStyle(color(noteColor)))); + }); + + ScryingLensOverlayRegistry.addDisplayer(HexBlocks.AKASHIC_BOOKSHELF, + (lines, state, pos, observer, world, direction) -> { + if (world.getBlockEntity(pos) instanceof BlockEntityAkashicBookshelf tile) { + var iotaTag = tile.getIotaTag(); + if (iotaTag != null) { + var display = HexIotaTypes.getDisplay(iotaTag); + lines.add(new Pair<>(new ItemStack(Items.BOOK), display)); + } + } + }); + + ScryingLensOverlayRegistry.addDisplayer(Blocks.COMPARATOR, + (lines, state, pos, observer, world, direction) -> { + int comparatorValue = ScryingLensOverlayRegistry.getComparatorValue(true); + lines.add(new Pair<>( + new ItemStack(Items.REDSTONE), + Component.literal(comparatorValue == -1 ? "" : String.valueOf(comparatorValue)) + .withStyle(redstoneColor(comparatorValue)))); + + boolean compare = state.getValue(ComparatorBlock.MODE) == ComparatorMode.COMPARE; + + lines.add(new Pair<>( + new ItemStack(Items.REDSTONE_TORCH), + Component.literal(compare ? ">=" : "-") + .withStyle(redstoneColor(compare ? 0 : 15)))); + }); + + ScryingLensOverlayRegistry.addDisplayer(Blocks.POWERED_RAIL, + (lines, state, pos, observer, world, direction) -> { + int power = getPoweredRailStrength(world, pos, state); + lines.add(new Pair<>( + new ItemStack(Items.POWERED_RAIL), + Component.literal(String.valueOf(power)) + .withStyle(redstoneColor(power, 9)))); + }); + + ScryingLensOverlayRegistry.addDisplayer(Blocks.REPEATER, + (lines, state, pos, observer, world, direction) -> lines.add(new Pair<>( + new ItemStack(Items.CLOCK), + Component.literal(String.valueOf(state.getValue(RepeaterBlock.DELAY))) + .withStyle(ChatFormatting.YELLOW)))); + + ScryingLensOverlayRegistry.addPredicateDisplayer( + (state, pos, observer, world, direction) -> state.getBlock() instanceof BeehiveBlock, + (lines, state, pos, observer, world, direction) -> { + int count = ScryingLensOverlayRegistry.getBeeValue(); + lines.add(new Pair<>(new ItemStack(Items.BEE_NEST), count == -1 ? Component.empty() : + Component.translatable( + "hexcasting.tooltip.lens.bee" + (count == 1 ? ".single" : ""), + count + ))); + }); + + ScryingLensOverlayRegistry.addPredicateDisplayer( + (state, pos, observer, world, direction) -> state.isSignalSource() && !state.is( + Blocks.COMPARATOR), + (lines, state, pos, observer, world, direction) -> { + int signalStrength = 0; + if (state.getBlock() instanceof RedStoneWireBlock) { + signalStrength = state.getValue(RedStoneWireBlock.POWER); + } else { + for (Direction dir : Direction.values()) { + signalStrength = Math.max(signalStrength, state.getSignal(world, pos, dir)); + } + } + + lines.add(0, new Pair<>( + new ItemStack(Items.REDSTONE), + Component.literal(String.valueOf(signalStrength)) + .withStyle(redstoneColor(signalStrength)))); + }); + + ScryingLensOverlayRegistry.addPredicateDisplayer( + (state, pos, observer, world, direction) -> state.hasAnalogOutputSignal(), + (lines, state, pos, observer, world, direction) -> { + int comparatorValue = ScryingLensOverlayRegistry.getComparatorValue(false); + lines.add( + new Pair<>( + new ItemStack(Items.COMPARATOR), + Component.literal(comparatorValue == -1 ? "" : String.valueOf(comparatorValue)) + .withStyle(redstoneColor(comparatorValue)))); + }); + } + + private static UnaryOperator