From f2e5075b3f627c7a8c5c2d4a0ccc4c540775654d Mon Sep 17 00:00:00 2001 From: Softrad Date: Fri, 6 Mar 2026 18:22:19 +0300 Subject: [PATCH] Full port to 1.21.1 neoforge of the latest version Sorry for huge and messy commit, was working on it on local git branch. --- .gitignore | 3 + .vscode/settings.json | 4 +- CHANGELOG.md | 4 + Common/build.gradle | 42 +-- .../main/java/at/petrak/hexcasting/README.md | 9 - .../java/at/petrak/hexcasting/api/HexAPI.java | 60 +--- .../FailToCastGreatSpellTrigger.java | 37 +-- .../advancements/HexAdvancementTriggers.java | 6 +- .../api/advancements/MinMaxLongs.java | 97 +++--- .../api/advancements/OvercastTrigger.java | 78 ++--- .../api/advancements/SpendMediaTrigger.java | 60 ++-- .../hexcasting/api/block/HexBlockEntity.java | 13 +- .../block/circle/BlockCircleComponent.java | 1 - .../hexcasting/api/casting/ActionUtils.kt | 2 - .../casting/arithmetic/engine/HashCons.java | 1 - .../circles/BlockEntityAbstractImpetus.java | 13 +- .../casting/circles/CircleExecutionState.java | 24 +- .../api/casting/eval/CastingEnvironment.java | 4 +- .../api/casting/eval/env/CircleCastEnv.java | 2 +- .../casting/eval/env/PlayerBasedCastEnv.java | 17 +- .../api/casting/eval/vm/ContinuationFrame.kt | 6 +- .../api/casting/iota/EntityIota.java | 28 +- .../hexcasting/api/casting/iota/IotaType.java | 4 +- .../api/casting/iota/PatternIota.java | 4 +- .../hexcasting/api/casting/mishaps/Mishap.kt | 2 - .../api/casting/mishaps/MishapBadEntity.kt | 2 +- .../casting/mishaps/MishapEntityTooFarAway.kt | 2 +- .../api/casting/mishaps/MishapImmuneEntity.kt | 2 +- .../mishaps/MishapInternalException.kt | 5 +- .../mishaps/circle/MishapNoSpellCircle.kt | 3 +- .../hexcasting/api/item/IotaHolderItem.java | 10 +- .../petrak/hexcasting/api/mod/HexConfig.java | 8 +- .../hexcasting/api/pigment/FrozenPigment.java | 9 +- .../petrak/hexcasting/api/utils/HexUtils.kt | 12 +- .../petrak/hexcasting/api/utils/NBTHelper.kt | 55 +++- .../client/RegisterClientStuff.java | 2 +- .../client/entity/WallScrollRenderer.java | 63 ++-- .../hexcasting/client/gui/GuiSpellcasting.kt | 24 +- .../client/gui/PatternTooltipComponent.java | 9 +- .../hexcasting/client/model/AltioraLayer.java | 4 +- .../client/model/HexRobesModels.java | 2 - ...yOwnArmorModelWithBlackjackAndHookers.java | 12 +- .../client/particles/ConjureParticle.java | 14 +- .../client/render/HexAdditionalRenderers.java | 22 +- .../client/render/PATTERN_RENDER_LORE.md | 52 --- .../client/render/PatternColors.java | 11 +- .../client/render/PatternSettings.java | 5 - .../hexcasting/client/render/RenderLib.kt | 36 +-- .../hexcasting/client/render/VCDrawHelper.kt | 39 ++- .../render/WorldlyPatternRenderHelpers.java | 2 +- .../be/BlockEntityQuenchedAllayRenderer.java | 3 +- .../render/shader/FakeBufferSource.java | 36 ++- .../common/blocks/BlockConjured.java | 5 +- .../blocks/akashic/BlockAkashicBookshelf.java | 14 +- .../akashic/BlockEntityAkashicBookshelf.java | 1 - .../impetuses/BlockEntityLookingImpetus.java | 3 +- .../impetuses/BlockEntityRedstoneImpetus.java | 14 +- .../impetuses/BlockRedstoneImpetus.java | 14 +- .../impetuses/BlockRightClickImpetus.java | 11 +- .../decoration/BlockAmethystDirectional.java | 8 + .../blocks/decoration/BlockHexDoor.java | 2 +- .../blocks/decoration/BlockHexFenceGate.java | 2 +- .../decoration/BlockHexPressurePlate.java | 4 +- .../blocks/decoration/BlockHexTrapdoor.java | 2 +- .../blocks/decoration/BlockHexWoodButton.java | 2 +- .../common/blocks/decoration/BlockSconce.java | 4 - .../casting/PatternRegistryManifest.java | 2 +- .../casting/actions/SpecialHandlerCompat.kt | 47 +++ .../casting/actions/spells/OpColorize.kt | 2 +- .../casting/actions/spells/OpDestroyFluid.kt | 1 + .../casting/actions/spells/OpEdifySapling.kt | 2 +- .../casting/actions/spells/OpExplode.kt | 1 - .../casting/actions/spells/OpExtinguish.kt | 4 +- .../common/casting/actions/spells/OpFlight.kt | 1 - .../common/casting/actions/spells/OpIgnite.kt | 2 +- .../casting/actions/spells/OpPlaceBlock.kt | 4 +- .../casting/actions/spells/OpPotionEffect.kt | 7 +- .../actions/spells/great/OpBrainsweep.kt | 7 +- .../actions/spells/great/OpTeleport.kt | 6 +- .../command/ListPerWorldPatternsCommand.java | 9 +- .../common/entities/EntityWallScroll.java | 46 ++- .../hexcasting/common/impl/HexAPIImpl.java | 59 +--- .../common/items/ItemJewelerHammer.java | 4 +- .../hexcasting/common/items/ItemLens.java | 35 +- .../common/items/ItemLoreFragment.java | 6 +- .../hexcasting/common/items/ItemStaff.java | 4 +- .../common/items/armor/ItemRobes.java | 3 +- .../common/items/magic/ItemAncientCypher.java | 6 +- .../items/magic/ItemCreativeUnlocker.java | 37 ++- .../common/items/magic/ItemMediaHolder.java | 10 +- .../common/items/magic/ItemPackagedHex.java | 1 - .../common/items/pigment/ItemUUIDPigment.java | 35 +- .../common/items/storage/ItemAbacus.java | 5 +- .../common/items/storage/ItemFocus.java | 7 +- .../common/items/storage/ItemScroll.java | 19 +- .../common/items/storage/ItemSlate.java | 4 +- .../common/items/storage/ItemSpellbook.java | 24 +- .../common/items/storage/ItemThoughtKnot.java | 3 +- .../hexcasting/common/lib/HexAttributes.java | 23 +- .../common/lib/HexBlockEntities.java | 2 +- .../hexcasting/common/lib/HexBlocks.java | 26 +- .../common/lib/HexConfiguredFeatures.java | 2 +- .../hexcasting/common/lib/HexDamageTypes.java | 4 +- .../common/lib/HexDataComponents.java | 25 ++ .../common/lib/HexFeatureConfigs.java | 1 - .../hexcasting/common/lib/HexItems.java | 18 +- .../common/lib/HexLootFunctions.java | 6 +- .../hexcasting/common/lib/HexMobEffects.java | 22 +- .../hexcasting/common/lib/HexPotions.java | 48 +-- .../common/lib/hex/HexSpecialHandlers.java | 3 + .../loot/AddHexToAncientCypherFunc.java | 30 +- .../loot/AddPerWorldPatternToScrollFunc.java | 27 +- .../common/loot/AmethystReducerFunc.java | 30 +- .../common/loot/HexLootHandler.java | 62 ++-- .../common/misc/AkashicTreeGrower.java | 21 +- .../common/misc/PatternDisplayHelper.java | 60 ++++ .../hexcasting/common/msgs/IMessage.java | 3 +- .../hexcasting/common/msgs/MsgBeepS2C.java | 15 +- .../common/msgs/MsgCastParticleS2C.java | 17 +- .../msgs/MsgClearSpiralPatternsS2C.java | 15 +- .../common/msgs/MsgNewSpellPatternC2S.java | 15 +- .../common/msgs/MsgNewSpellPatternS2C.java | 23 +- .../common/msgs/MsgNewSpiralPatternsS2C.java | 17 +- .../common/msgs/MsgNewWallScrollS2C.java | 21 +- .../common/msgs/MsgOpenSpellGuiS2C.java | 23 +- .../msgs/MsgRecalcWallScrollDisplayS2C.java | 15 +- .../common/msgs/MsgShiftScrollC2S.java | 25 +- .../particles/ConjureParticleOptions.java | 53 +-- .../common/recipe/BrainsweepRecipe.java | 147 +++++++-- .../common/recipe/SealSpellbookRecipe.java | 12 +- .../common/recipe/SealThingsRecipe.java | 25 +- .../ingredient/StateIngredientBlockState.java | 2 +- .../ingredient/StateIngredientHelper.java | 8 +- .../brainsweep/VillagerIngredient.java | 4 +- .../hexcasting/datagen/HexAdvancements.java | 4 +- .../datagen/recipe/HexplatRecipes.java | 4 +- .../builders/BrainsweepRecipeBuilder.java | 5 +- .../datagen/tag/HexActionTagProvider.java | 2 +- .../datagen/tag/HexBlockTagProvider.java | 2 +- .../petrak/hexcasting/interop/HexInterop.java | 27 +- .../interop/inline/InlinePatternData.java | 5 +- .../patchouli/AbstractPatternComponent.java | 8 +- .../patchouli/BrainsweepProcessor.java | 65 ++-- .../patchouli/CustomComponentTooltip.java | 14 +- .../patchouli/LookupPatternComponent.java | 9 +- .../patchouli/ManualPatternComponent.java | 13 +- .../patchouli/MultiCraftingProcessor.java | 15 +- .../interop/patchouli/PatchouliUtils.java | 23 +- .../interop/patchouli/PatternProcessor.java | 7 +- .../mixin/MixinAbstractVillager.java | 2 +- .../hexcasting/mixin/MixinLivingEntity.java | 2 +- .../at/petrak/hexcasting/mixin/MixinMob.java | 4 +- .../petrak/hexcasting/mixin/MixinRaider.java | 3 +- .../hexcasting/mixin/MixinVillager.java | 4 +- .../mixin/MixinWanderingTrader.java | 5 +- .../petrak/hexcasting/mixin/MixinWitch.java | 3 +- .../mixin/accessor/AccessorAbstractArrow.java | 2 +- .../mixin/accessor/AccessorEntity.java | 2 +- .../mixin/accessor/AccessorLivingEntity.java | 2 +- .../mixin/accessor/AccessorLootTable.java | 7 +- .../mixin/accessor/AccessorPotionBrewing.java | 14 - .../mixin/accessor/AccessorUseOnContext.java | 2 +- .../mixin/accessor/AccessorVillager.java | 2 +- .../accessor/CriteriaTriggersAccessor.java | 4 +- .../AccessorBlockEntityRenderDispatcher.java | 2 +- .../client/AccessorCompositeRenderType.java | 2 +- .../AccessorEmptyTextureStateShard.java | 2 +- .../accessor/client/AccessorMouseHandler.java | 6 +- .../client/AccessorRenderStateShard.java | 2 +- .../accessor/client/AccessorRenderType.java | 2 +- .../mixin/client/MixinClientLevel.java | 1 + .../mixin/client/MixinPlayerRenderer.java | 1 + .../server/ScrungledPatternsSave.java | 14 +- .../en_us/entries/items/ancient_cyphers.json | 2 +- .../en_us/entries/items/creative_items.json | 2 +- .../en_us/entries/items/hexcasting.json | 2 +- .../en_us/entries/items/phials.json | 2 +- .../en_us/entries/items/potions.json | 4 +- .../patterns/great_spells/make_battery.json | 2 +- .../patterns/great_spells/zeniths.json | 2 +- .../entries/patterns/spells/hexcasting.json | 2 +- .../en_us/entries/patterns/spells/nadirs.json | 2 +- .../hexcasting/recipes/directrix/empty.json | 27 ++ Common/src/main/resources/hexplat.mixins.json | 2 +- .../FabricMixinReloadableServerResources.java | 10 +- Forge/build.gradle | 201 ++++-------- Forge/gradle.properties | 10 +- Forge/libs/Patchouli-1.21.1-92-NEOFORGE.jar | Bin 0 -> 646486 bytes Forge/libs/caelus-neoforge-7.0.1+1.21.1.jar | Bin 0 -> 50235 bytes .../forge/ForgeHexClientInitializer.java | 70 ++-- .../hexcasting/forge/ForgeHexConfig.java | 62 ++-- .../hexcasting/forge/ForgeHexInitializer.java | 159 ++++----- .../hexcasting/forge/cap/CapSyncers.java | 45 ++- .../forge/cap/ForgeCapabilityHandler.java | 293 +++++++---------- .../forge/cap/ForgeImpetusCapability.java | 2 +- .../hexcasting/forge/cap/HexCapabilities.java | 36 ++- .../cap/adimpl/CapClientCastingStack.java | 17 +- .../datagen/ForgeHexConditionsBuilder.java | 70 +++- .../forge/datagen/ForgeHexDataGenerators.java | 18 +- .../forge/datagen/ForgeHexLootModGen.java | 4 +- .../forge/datagen/TagsProviderEFHSetter.java | 7 - .../xplat/HexBlockStatesAndModels.java | 10 +- .../forge/datagen/xplat/HexItemModels.java | 10 +- .../interop/curios/CuriosApiInterop.java | 43 ++- .../forge/interop/curios/CuriosRenderers.java | 6 +- .../interop/curios/LensCurioRenderer.java | 2 +- .../interop/jei/BrainsweepRecipeCategory.java | 15 +- .../interop/jei/EdifyRecipeCategory.java | 4 +- .../forge/interop/jei/HexJEIPlugin.java | 8 +- .../interop/jei/PhialRecipeCategory.java | 4 +- .../lib/ForgeHexArgumentTypeRegistry.java | 22 +- .../forge/lib/ForgeHexIngredientTypes.java | 27 ++ .../forge/lib/ForgeHexLootMods.java | 30 +- .../forge/loot/ForgeHexAmethystLootMod.java | 23 +- .../forge/loot/ForgeHexCypherLootMod.java | 12 +- .../forge/loot/ForgeHexLoreLootMod.java | 12 +- .../forge/loot/ForgeHexScrollLootMod.java | 13 +- .../mixin/ForgeAccessorBuiltInRegistries.java | 2 +- .../forge/mixin/ForgeMixinBlockColors.java | 16 - .../mixin/ForgeMixinCustomPacketPayload.java | 60 ++++ .../forge/mixin/ForgeMixinItemColors.java | 17 - .../mixin/ForgeMixinNetworkRegistry.java | 278 ++++++++++++++++ .../forge/mixin/ForgeMixinTagsProvider.java | 19 +- .../forge/mixin/TagsProviderEFHSetter.java | 11 + .../forge/network/ForgePacketHandler.java | 108 +++---- .../forge/network/MsgAltioraUpdateAck.java | 15 +- .../forge/network/MsgBrainsweepAck.java | 15 +- .../forge/network/MsgPigmentUpdateAck.java | 20 +- .../network/MsgSentinelStatusUpdateAck.java | 15 +- .../recipe/ForgeModConditionalIngredient.java | 119 +++---- .../forge/recipe/ForgeUnsealedIngredient.java | 67 ++-- .../forge/xplat/ForgeClientXplatImpl.java | 14 +- .../forge/xplat/ForgeOptionalMods.java | 80 +++++ .../forge/xplat/ForgeXplatImpl.java | 173 +++++----- .../resources/META-INF/neoforge.mods.toml | 63 ++++ .../resources/hexcasting_forge.mixins.json | 7 +- Jenkinsfile | 73 ----- Paucal | 1 + build.gradle | 16 +- compile-mixins.txt | 306 ++++++++++++++++++ compile-output.txt | Bin 0 -> 5232 bytes gradle.properties | 17 +- settings.gradle | 7 +- 243 files changed, 3190 insertions(+), 2220 deletions(-) delete mode 100644 Common/src/main/java/at/petrak/hexcasting/README.md delete mode 100644 Common/src/main/java/at/petrak/hexcasting/client/render/PATTERN_RENDER_LORE.md create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/casting/actions/SpecialHandlerCompat.kt create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/lib/HexDataComponents.java create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/misc/PatternDisplayHelper.java delete mode 100644 Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorPotionBrewing.java create mode 100644 Common/src/main/resources/data/hexcasting/recipes/directrix/empty.json create mode 100644 Forge/libs/Patchouli-1.21.1-92-NEOFORGE.jar create mode 100644 Forge/libs/caelus-neoforge-7.0.1+1.21.1.jar delete mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/datagen/TagsProviderEFHSetter.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexIngredientTypes.java delete mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinBlockColors.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinCustomPacketPayload.java delete mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinItemColors.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinNetworkRegistry.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/mixin/TagsProviderEFHSetter.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeOptionalMods.java create mode 100644 Forge/src/main/resources/META-INF/neoforge.mods.toml delete mode 100644 Jenkinsfile create mode 160000 Paucal create mode 100644 compile-mixins.txt create mode 100644 compile-output.txt diff --git a/.gitignore b/.gitignore index 6cd3f2bc82..9a993dd681 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ __gradle_version__.py # eclipse bin *.launch + +# vscode - machine-specific run configs +.vscode/launch.json .settings .metadata .classpath diff --git a/.vscode/settings.json b/.vscode/settings.json index 7a26f45b1a..bbbeae8e79 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,7 +17,7 @@ "ruff.lint.args": [ "--extend-ignore=I", // format on save is enabled, so don't show the squiggles ], - "python.languageServer": "Pylance", + "python.languageServer": "None", "python.analysis.diagnosticMode": "workspace", "python.analysis.packageIndexDepths": [ {"name": "hexdoc", "depth": 3}, @@ -31,4 +31,6 @@ "*.jcss.jinja": "jinja-css", // for files with a lot of jinja stuff, where the linting isn't useful "*.json5.jinja": "json5", }, + "cursorpyright.analysis.diagnosticMode": "workspace", + "java.configuration.updateBuildConfiguration": "automatic", } diff --git a/CHANGELOG.md b/CHANGELOG.md index f4498b2755..2405c97252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Added +- **1.21.1 NeoForge port (draft):** Build system updated to NeoForge (NeoGradle/ModDevGradle), Java 21, Paucal 0.7.x, Patchouli 1.21.1-92, Caelus 7.x. Data component scaffold for Iota/item storage ([HexDataComponents](Common/src/main/java/at/petrak/hexcasting/common/lib/HexDataComponents.java)). - Added the `cannot_modify_cost` tag for patterns that should ignore the `media_consumption` attribute when calculating cost, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987). ### Changed @@ -16,6 +17,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Fixed +- Fixed staff/actionable items not opening the spell GUI and "broken iota" on empty containers on NeoForge 21.1.x. NeoForge's payload direction checks rejected client-bound packets (e.g. hexcasting:cgui, hexcasting:clr_spi_pats_sc). Added `ForgeMixinNetworkRegistry` to bypass the check for hex casting payloads. +- Fixed Patchouli thehexbook failing to load due to malformed `potion_contents` in 1.21.1. Updated potion item strings to use SNBT compound format: `potion_contents={potion:"hexcasting:enlarge_grid"}` (entries: potions.json, nadirs.json, zeniths.json). +- Fixed media bar/tooltip not updating after amethyst consumption until rejoin. Added `broadcastFullState()` after media extraction to sync inventory to client immediately. - Fixed a crash loop when trying to generate a creative-mode ancient scroll for a Great Spell whose per-world pattern hasn't been calculated yet, by Robotgiggle in [992](https://github.com/FallingColors/HexMod/pull/992). ## `0.11.3` - 2025-11-22 diff --git a/Common/build.gradle b/Common/build.gradle index aca1334466..ba67995fec 100644 --- a/Common/build.gradle +++ b/Common/build.gradle @@ -9,33 +9,28 @@ minecraft { } repositories { + mavenLocal() mavenCentral() - 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" - } - - maven { url "https://maven.shedaniel.me/" } - + maven { url = 'https://maven.neoforged.net/releases' } + maven { url = 'https://maven.minecraftforge.net' } + maven { name = "Progwml6 maven"; url = "https://dvs1.progwml6.com/files/maven/" } + maven { name = "ModMaven"; url = "https://modmaven.dev" } + maven { url = "https://maven.shedaniel.me/" } + maven { url = "https://api.modrinth.com/maven" } } 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-SNAPSHOT" + // Paucal: from mavenLocal or includeBuild (groupId at.petrak) + compileOnly "at.petrak:paucal-neoforge-$minecraftVersion:$paucalVersion" + compileOnly "vazkii.patchouli:Patchouli-xplat:$patchouliVersion-SNAPSHOT" - compileOnly "com.samsthenerd.inline:inline-forge:$minecraftVersion-$inlineVersion" + // Optional: Inline (pattern tooltips in chat) - uncomment to enable Inline integration + // Also remove 'at/petrak/hexcasting/interop/inline/**' from sourceSets.main.java.exclude in this file + // compileOnly "maven.modrinth:inline:$minecraftVersion-$inlineVersion-neoforge" compileOnly "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" testCompileOnly "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" @@ -55,3 +50,14 @@ processResources { expand buildProps } } + +// Datagen sources are not required to run the client; exclude to unblock NeoForge port. +// Inline interop is excluded so the mod compiles without the Inline dependency. +sourceSets { + main { + java { + exclude 'at/petrak/hexcasting/datagen/**' + exclude 'at/petrak/hexcasting/interop/inline/**' + } + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/README.md b/Common/src/main/java/at/petrak/hexcasting/README.md deleted file mode 100644 index bb6d151cfe..0000000000 --- a/Common/src/main/java/at/petrak/hexcasting/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Hello, intrepid Github reader! - -The "flavor text" words for things in this mod and the internal names are different. (Sorry.) - -- A "Hex" is a `Continuation`, cast through a [`CastingVM`](api/casting/eval/vm/CastingVM.kt) -- A "Pattern" is a [`HexPattern`](api/casting/math/HexPattern.kt) -- An "Action" is an [`Action`](api/casting/castables/Action.kt) -- An action that pushes a spell is a [`Spell`](api/casting/castables/SpellAction.kt) - diff --git a/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java b/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java index 8ddde5669b..7f2489d2e7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java @@ -165,49 +165,21 @@ default FrozenPigment getColorizer(Player player) { return FrozenPigment.DEFAULT.get(); } - ArmorMaterial DUMMY_ARMOR_MATERIAL = new ArmorMaterial() { - @Override - public int getDurabilityForType(ArmorItem.Type type) { - return 0; - } - - @Override - public int getDefenseForType(ArmorItem.Type type) { - return 0; - } - - @Override - public int getEnchantmentValue() { - return 0; - } - - @NotNull - @Override - public SoundEvent getEquipSound() { - return SoundEvents.ARMOR_EQUIP_LEATHER; - } - - @NotNull - @Override - public Ingredient getRepairIngredient() { - return Ingredient.EMPTY; - } - - @Override - public String getName() { - return "missingno"; - } - - @Override - public float getToughness() { - return 0; - } - - @Override - public float getKnockbackResistance() { - return 0; - } - }; + ArmorMaterial DUMMY_ARMOR_MATERIAL = new ArmorMaterial( + java.util.Map.of( + ArmorItem.Type.BOOTS, 0, + ArmorItem.Type.LEGGINGS, 0, + ArmorItem.Type.CHESTPLATE, 0, + ArmorItem.Type.HELMET, 0, + ArmorItem.Type.BODY, 0 + ), + 0, + SoundEvents.ARMOR_EQUIP_LEATHER, + () -> Ingredient.EMPTY, + java.util.List.of(new ArmorMaterial.Layer(modLoc("missingno"))), + 0f, + 0f + ); default ArmorMaterial robesMaterial() { return DUMMY_ARMOR_MATERIAL; @@ -229,6 +201,6 @@ static HexAPI instance() { } static ResourceLocation modLoc(String s) { - return new ResourceLocation(MOD_ID, s); + return ResourceLocation.fromNamespaceAndPath(MOD_ID, s); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java b/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java index fe85fec5b3..6c3cb568b6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/advancements/FailToCastGreatSpellTrigger.java @@ -1,39 +1,30 @@ package at.petrak.hexcasting.api.advancements; -import com.google.gson.JsonObject; -import net.minecraft.advancements.critereon.*; -import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; 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; - } +import java.util.Optional; +public class FailToCastGreatSpellTrigger extends SimpleCriterionTrigger { @Override - protected Instance createInstance(JsonObject json, ContextAwarePredicate predicate, DeserializationContext context) { - return new Instance(predicate); + public Codec codec() { + return Instance.CODEC; } public void trigger(ServerPlayer player) { super.trigger(player, e -> true); } - public static class Instance extends AbstractCriterionTriggerInstance { - public Instance(ContextAwarePredicate predicate) { - super(ID, predicate); - } - - @Override - public ResourceLocation getCriterion() { - return ID; - } + public static record Instance(Optional player) implements SimpleCriterionTrigger.SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + ContextAwarePredicate.CODEC.optionalFieldOf("player").forGetter(Instance::player) + ).apply(inst, Instance::new)); - public JsonObject serializeToJson(SerializationContext pConditions) { - return new JsonObject(); + public Instance(ContextAwarePredicate player) { + this(Optional.of(player)); } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java b/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java index 16af02ab39..5a2731b6a7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/advancements/HexAdvancementTriggers.java @@ -8,8 +8,8 @@ public class HexAdvancementTriggers { 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); + CriteriaTriggersAccessor.hex$register("hexcasting:overcast", OVERCAST_TRIGGER); + CriteriaTriggersAccessor.hex$register("hexcasting:spend_media", SPEND_MEDIA_TRIGGER); + CriteriaTriggersAccessor.hex$register("hexcasting:fail_to_cast_great_spell", FAIL_GREAT_SPELL_TRIGGER); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/advancements/MinMaxLongs.java b/Common/src/main/java/at/petrak/hexcasting/api/advancements/MinMaxLongs.java index 0be502c86e..b1c02e5111 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/advancements/MinMaxLongs.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/advancements/MinMaxLongs.java @@ -1,40 +1,32 @@ package at.petrak.hexcasting.api.advancements; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.BuiltInExceptionProvider; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.advancements.critereon.MinMaxBounds; import net.minecraft.util.GsonHelper; import javax.annotation.Nullable; -import java.util.Objects; -import java.util.function.Function; +import java.util.Optional; -public class MinMaxLongs extends MinMaxBounds { - public static final MinMaxLongs ANY = new MinMaxLongs(null, null); - @Nullable - private final Long minSq; - @Nullable - private final Long maxSq; +/** + * Replacement for the old MinMaxBounds now that MinMaxBounds is an interface in 1.21. + * + * JSON form matches vanilla MinMaxBounds: either a number, or an object with "min"/"max". + */ +public record MinMaxLongs(Optional min, Optional max) implements MinMaxBounds { + public static final MinMaxLongs ANY = new MinMaxLongs(Optional.empty(), Optional.empty()); - private static MinMaxLongs create(StringReader reader, @Nullable Long min, @Nullable Long max) throws CommandSyntaxException { - if (min != null && max != null && min > max) { - throw ERROR_SWAPPED.createWithContext(reader); - } else { - return new MinMaxLongs(min, max); - } - } - - @Nullable - private static Long squareOpt(@Nullable Long l) { - return l == null ? null : l * l; - } + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.optionalFieldOf("min").forGetter(MinMaxLongs::min), + Codec.LONG.optionalFieldOf("max").forGetter(MinMaxLongs::max) + ).apply(inst, MinMaxLongs::new)); - private MinMaxLongs(@Nullable Long min, @Nullable Long max) { - super(min, max); - this.minSq = squareOpt(min); - this.maxSq = squareOpt(max); + public MinMaxLongs(@Nullable Long min, @Nullable Long max) { + this(Optional.ofNullable(min), Optional.ofNullable(max)); } public static MinMaxLongs exactly(long l) { @@ -53,33 +45,54 @@ public static MinMaxLongs atMost(long max) { return new MinMaxLongs(null, max); } + public boolean isAny() { + return min.isEmpty() && max.isEmpty(); + } + public boolean matches(long l) { - if (this.min != null && this.min > l) { - return false; - } else { - return this.max == null || this.max >= l; - } + if (min.isPresent() && min.get() > l) return false; + return max.isEmpty() || max.get() >= l; } public boolean matchesSqr(long l) { - if (this.minSq != null && this.minSq > l) { - return false; - } else { - return this.maxSq == null || this.maxSq >= l; - } + Long minSq = min.map(v -> v * v).orElse(null); + Long maxSq = max.map(v -> v * v).orElse(null); + if (minSq != null && minSq > l) return false; + return maxSq == null || maxSq >= l; } public static MinMaxLongs fromJson(@Nullable JsonElement json) { - return fromJson(json, ANY, GsonHelper::convertToLong, MinMaxLongs::new); + if (json == null || json.isJsonNull()) return ANY; + if (json.isJsonPrimitive()) { + long v = GsonHelper.convertToLong(json, "value"); + return exactly(v); + } + JsonObject obj = GsonHelper.convertToJsonObject(json, "range"); + Long min = obj.has("min") ? GsonHelper.getAsLong(obj, "min") : null; + Long max = obj.has("max") ? GsonHelper.getAsLong(obj, "max") : null; + return new MinMaxLongs(min, max); } public static MinMaxLongs fromReader(StringReader reader) throws CommandSyntaxException { - return fromReader(reader, (l) -> l); - } + // Minimal parser: supports "5", "5..", "..5", "5..10" + int start = reader.getCursor(); + String remaining = reader.getRemaining(); + int space = remaining.indexOf(' '); + String token = space >= 0 ? remaining.substring(0, space) : remaining; + reader.setCursor(start + token.length()); - public static MinMaxLongs fromReader(StringReader reader, Function map) throws CommandSyntaxException { - BuiltInExceptionProvider builtInExceptions = CommandSyntaxException.BUILT_IN_EXCEPTIONS; - Objects.requireNonNull(builtInExceptions); - return fromReader(reader, MinMaxLongs::create, Long::parseLong, builtInExceptions::readerInvalidInt, map); + int dots = token.indexOf(".."); + if (dots < 0) { + long v = Long.parseLong(token); + return exactly(v); + } + String left = token.substring(0, dots); + String right = token.substring(dots + 2); + Long min = left.isEmpty() ? null : Long.parseLong(left); + Long max = right.isEmpty() ? null : Long.parseLong(right); + if (min != null && max != null && min > max) { + throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidInt().createWithContext(reader, token); + } + return new MinMaxLongs(min, max); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java b/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java index b1661e869e..433295f08f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/advancements/OvercastTrigger.java @@ -1,17 +1,19 @@ 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 com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; import net.minecraft.server.level.ServerPlayer; +import java.util.Optional; + // 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 @@ -19,17 +21,8 @@ public class OvercastTrigger extends SimpleCriterionTrigger codec() { + return Instance.CODEC; } public void trigger(ServerPlayer player, int mediaGenerated) { @@ -40,47 +33,28 @@ public void trigger(ServerPlayer player, int mediaGenerated) { }); } - 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(ContextAwarePredicate 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; + public static record Instance(Optional player, + MinMaxBounds.Ints mediaGenerated, + MinMaxBounds.Doubles healthUsed, + MinMaxBounds.Doubles healthLeft) implements SimpleCriterionTrigger.SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + ContextAwarePredicate.CODEC.optionalFieldOf("player").forGetter(Instance::player), + MinMaxBounds.Ints.CODEC.optionalFieldOf(TAG_MEDIA_GENERATED, MinMaxBounds.Ints.ANY).forGetter(Instance::mediaGenerated), + MinMaxBounds.Doubles.CODEC.optionalFieldOf(TAG_HEALTH_USED, MinMaxBounds.Doubles.ANY).forGetter(Instance::healthUsed), + MinMaxBounds.Doubles.CODEC.optionalFieldOf(TAG_HEALTH_LEFT, MinMaxBounds.Doubles.ANY).forGetter(Instance::healthLeft) + ).apply(inst, Instance::new)); + + public Instance(ContextAwarePredicate player, + MinMaxBounds.Ints mediaGenerated, + MinMaxBounds.Doubles healthUsed, + MinMaxBounds.Doubles healthLeft) { + this(Optional.of(player), mediaGenerated, healthUsed, healthLeft); } 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); + && this.healthLeft.matches((double) healthLeftIn); } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java b/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java index d610807f59..2efb21f101 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/advancements/SpendMediaTrigger.java @@ -1,59 +1,37 @@ package at.petrak.hexcasting.api.advancements; -import com.google.gson.JsonObject; -import net.minecraft.advancements.critereon.*; -import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; import net.minecraft.server.level.ServerPlayer; -public class SpendMediaTrigger extends SimpleCriterionTrigger { - private static final ResourceLocation ID = new ResourceLocation("hexcasting", "spend_media"); +import java.util.Optional; +public class SpendMediaTrigger extends SimpleCriterionTrigger { 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, ContextAwarePredicate predicate, - DeserializationContext context) { - return new Instance(predicate, - MinMaxLongs.fromJson(json.get(TAG_MEDIA_SPENT)), - MinMaxLongs.fromJson(json.get(TAG_MEDIA_WASTED))); + public Codec codec() { + return Instance.CODEC; } public void trigger(ServerPlayer player, long mediaSpent, long mediaWasted) { super.trigger(player, inst -> inst.test(mediaSpent, mediaWasted)); } - public static class Instance extends AbstractCriterionTriggerInstance { - protected final MinMaxLongs mediaSpent; - protected final MinMaxLongs mediaWasted; - - public Instance(ContextAwarePredicate predicate, MinMaxLongs mediaSpent, - MinMaxLongs 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; + public static record Instance(Optional player, + MinMaxLongs mediaSpent, + MinMaxLongs mediaWasted) implements SimpleCriterionTrigger.SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + ContextAwarePredicate.CODEC.optionalFieldOf("player").forGetter(Instance::player), + MinMaxLongs.CODEC.optionalFieldOf(TAG_MEDIA_SPENT, MinMaxLongs.ANY).forGetter(Instance::mediaSpent), + MinMaxLongs.CODEC.optionalFieldOf(TAG_MEDIA_WASTED, MinMaxLongs.ANY).forGetter(Instance::mediaWasted) + ).apply(inst, Instance::new)); + + public Instance(ContextAwarePredicate player, MinMaxLongs mediaSpent, MinMaxLongs mediaWasted) { + this(Optional.of(player), mediaSpent, mediaWasted); } private boolean test(long mediaSpentIn, long mediaWastedIn) { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java b/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java index e531ddb12d..3e1b6f84ab 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/block/HexBlockEntity.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.api.block; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -19,18 +20,18 @@ public HexBlockEntity(BlockEntityType pType, BlockPos pWorldPosition, BlockSt protected abstract void loadModData(CompoundTag tag); @Override - protected void saveAdditional(CompoundTag pTag) { + protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider provider) { this.saveModData(pTag); } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider provider) { + super.loadAdditional(pTag, provider); this.loadModData(pTag); } @Override - public CompoundTag getUpdateTag() { + public CompoundTag getUpdateTag(HolderLookup.Provider provider) { CompoundTag tag = new CompoundTag(); this.saveModData(tag); return tag; @@ -43,7 +44,9 @@ public Packet getUpdatePacket() { public void sync() { this.setChanged(); - this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + if (this.level != null) { + this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java b/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java index f2c1458c7b..43fefcd0b1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockCircleComponent.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; -// Convenience impl of ICircleComponent public abstract class BlockCircleComponent extends Block implements ICircleComponent { public static final BooleanProperty ENERGIZED = BooleanProperty.create("energized"); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt index c6dda37c9a..a2df8ca75f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt @@ -77,8 +77,6 @@ fun List.getBool(idx: Int, argc: Int = 0): 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) { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/HashCons.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/HashCons.java index c7566e783b..a215730ee5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/HashCons.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/HashCons.java @@ -4,7 +4,6 @@ import at.petrak.hexcasting.api.casting.iota.IotaType; import at.petrak.hexcasting.api.casting.math.HexPattern; -// Helper type for hashing lists of types. public sealed interface HashCons { public record Pattern(HexPattern operator) implements HashCons {} diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/BlockEntityAbstractImpetus.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/BlockEntityAbstractImpetus.java index ac8bf92d0d..f7d98a3357 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/BlockEntityAbstractImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/BlockEntityAbstractImpetus.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.block.circle.BlockCircleComponent; import at.petrak.hexcasting.api.misc.MediaConstants; import at.petrak.hexcasting.api.pigment.FrozenPigment; +import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.api.utils.MediaHelper; import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker; import at.petrak.hexcasting.common.lib.HexItems; @@ -285,6 +286,7 @@ public FrozenPigment getPigment() { @Override protected void saveModData(CompoundTag tag) { + var provider = this.level != null ? this.level.registryAccess() : net.minecraft.core.RegistryAccess.EMPTY; if (this.executionState != null) { tag.put(TAG_EXECUTION_STATE, this.executionState.save()); } @@ -292,10 +294,8 @@ protected void saveModData(CompoundTag tag) { tag.putLong(TAG_MEDIA, this.media); if (this.displayMsg != null && this.displayItem != null) { - tag.putString(TAG_ERROR_MSG, Component.Serializer.toJson(this.displayMsg)); - var itemTag = new CompoundTag(); - this.displayItem.save(itemTag); - tag.put(TAG_ERROR_DISPLAY, itemTag); + tag.putString(TAG_ERROR_MSG, Component.Serializer.toJson(this.displayMsg, provider)); + tag.put(TAG_ERROR_DISPLAY, HexUtils.serializeToNBT(this.displayItem, provider)); } if (this.pigment != null) tag.put(TAG_PIGMENT, this.pigment.serializeToNBT()); @@ -303,6 +303,7 @@ protected void saveModData(CompoundTag tag) { @Override protected void loadModData(CompoundTag tag) { + var provider = this.level != null ? this.level.registryAccess() : net.minecraft.core.RegistryAccess.EMPTY; this.executionState = null; if (tag.contains(TAG_EXECUTION_STATE, Tag.TAG_COMPOUND)) { this.lazyExecutionState = tag.getCompound(TAG_EXECUTION_STATE); @@ -315,8 +316,8 @@ protected void loadModData(CompoundTag tag) { } if (tag.contains(TAG_ERROR_MSG, Tag.TAG_STRING) && tag.contains(TAG_ERROR_DISPLAY, Tag.TAG_COMPOUND)) { - var msg = Component.Serializer.fromJson(tag.getString(TAG_ERROR_MSG)); - var display = ItemStack.of(tag.getCompound(TAG_ERROR_DISPLAY)); + var msg = Component.Serializer.fromJson(tag.getString(TAG_ERROR_MSG), provider); + var display = ItemStack.parseOptional(provider, tag.getCompound(TAG_ERROR_DISPLAY)); this.displayMsg = msg; this.displayItem = display; } else { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/CircleExecutionState.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/CircleExecutionState.java index ae149a081e..36ad7ad5ca 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/CircleExecutionState.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/circles/CircleExecutionState.java @@ -183,21 +183,29 @@ public CompoundTag save() { } public static CircleExecutionState load(CompoundTag nbt, ServerLevel world) { - var startPos = NbtUtils.readBlockPos(nbt.getCompound(TAG_IMPETUS_POS)); + var startPos = NbtUtils.readBlockPos(nbt, TAG_IMPETUS_POS).orElse(BlockPos.ZERO); var startDir = Direction.values()[nbt.getByte(TAG_IMPETUS_DIR)]; var knownPositions = new HashSet(); - var knownTag = nbt.getList(TAG_KNOWN_POSITIONS, Tag.TAG_COMPOUND); - for (var tag : knownTag) { - knownPositions.add(NbtUtils.readBlockPos(HexUtils.downcast(tag, CompoundTag.TYPE))); + var knownRaw = nbt.get(TAG_KNOWN_POSITIONS); + if (knownRaw instanceof ListTag knownTag) { + for (var tag : knownTag) { + var tmp = new CompoundTag(); + tmp.put("p", tag); + NbtUtils.readBlockPos(tmp, "p").ifPresent(knownPositions::add); + } } var reachedPositions = new ArrayList(); - var reachedTag = nbt.getList(TAG_REACHED_POSITIONS, Tag.TAG_COMPOUND); - for (var tag : reachedTag) { - reachedPositions.add(NbtUtils.readBlockPos(HexUtils.downcast(tag, CompoundTag.TYPE))); + var reachedRaw = nbt.get(TAG_REACHED_POSITIONS); + if (reachedRaw instanceof ListTag reachedTag) { + for (var tag : reachedTag) { + var tmp = new CompoundTag(); + tmp.put("p", tag); + NbtUtils.readBlockPos(tmp, "p").ifPresent(reachedPositions::add); + } } - var currentPos = NbtUtils.readBlockPos(nbt.getCompound(TAG_CURRENT_POS)); + var currentPos = NbtUtils.readBlockPos(nbt, TAG_CURRENT_POS).orElse(startPos); var enteredFrom = Direction.values()[nbt.getByte(TAG_ENTERED_FROM)]; var image = CastingImage.loadFromNbt(nbt.getCompound(TAG_IMAGE), world); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java index 54e033b013..d5600a02c1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java @@ -240,7 +240,7 @@ public void postCast(CastingImage image) { * Return whether this env can cast great spells. */ public boolean isEnlightened() { - var adv = this.world.getServer().getAdvancements().getAdvancement(modLoc("enlightenment")); + var adv = this.world.getServer().getAdvancements().get(modLoc("enlightenment")); if (adv == null) return false; @@ -371,7 +371,7 @@ public final void assertEntityInRange(Entity e) throws MishapEntityTooFarAway { } /** - * Convenience function to throw if the vec is out of the world (for GTP) + * Convenience function to throw if the vec is out of the world */ public final void assertVecInWorld(Vec3 vec) throws MishapBadLocation { if (!this.isVecInWorld(vec)) { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java index 333deaa813..8a1c990c8a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java @@ -132,7 +132,7 @@ public long extractMediaEnvironment(long cost, boolean simulate) { public boolean isVecInRangeEnvironment(Vec3 vec) { var caster = this.execState.getCaster(this.world); if (caster != null) { - double sentinelRadius = caster.getAttributeValue(HexAttributes.SENTINEL_RADIUS); + double sentinelRadius = caster.getAttributeValue(HexAttributes.getHolder(caster, HexAttributes.SENTINEL_RADIUS_KEY)); if (vec.distanceToSqr(caster.position()) <= caster.getBbHeight() * caster.getBbHeight()) { return true; } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java index 1f5b6703ff..667d6637e1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java @@ -52,8 +52,8 @@ protected PlayerBasedCastEnv(ServerPlayer caster, InteractionHand castingHand) { super(caster.serverLevel()); this.caster = caster; this.castingHand = castingHand; - this.ambitRadius = caster.getAttributeValue(HexAttributes.AMBIT_RADIUS); - this.sentinelRadius = caster.getAttributeValue(HexAttributes.SENTINEL_RADIUS); + this.ambitRadius = caster.getAttributeValue(HexAttributes.getHolder(caster, HexAttributes.AMBIT_RADIUS_KEY)); + this.sentinelRadius = caster.getAttributeValue(HexAttributes.getHolder(caster, HexAttributes.SENTINEL_RADIUS_KEY)); } @Override @@ -69,10 +69,10 @@ public ServerPlayer getCaster() { @Override protected double getCostModifier(PatternShapeMatch match) { ResourceLocation loc = actionKey(match); - if (isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), loc, HexTags.Actions.CANNOT_MODIFY_COST)) { + if (loc == null || isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), loc, HexTags.Actions.CANNOT_MODIFY_COST)) { return 1.0; } else { - return this.caster.getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER); + return this.caster.getAttributeValue(HexAttributes.getHolder(this.caster, HexAttributes.MEDIA_CONSUMPTION_MODIFIER_KEY)); } } @@ -86,11 +86,11 @@ public void postExecution(CastResult result) { } } if (this.caster != null){ - double ambitAttribute = this.caster.getAttributeValue(HexAttributes.AMBIT_RADIUS); + double ambitAttribute = this.caster.getAttributeValue(HexAttributes.getHolder(this.caster, HexAttributes.AMBIT_RADIUS_KEY)); if (this.ambitRadius != ambitAttribute){ this.ambitRadius = ambitAttribute; } - double sentinelAttribute = this.caster.getAttributeValue(HexAttributes.SENTINEL_RADIUS); + double sentinelAttribute = this.caster.getAttributeValue(HexAttributes.getHolder(this.caster, HexAttributes.SENTINEL_RADIUS_KEY)); if (this.sentinelRadius != sentinelAttribute){ this.sentinelRadius = sentinelAttribute; } @@ -186,13 +186,16 @@ protected long extractMediaFromInventory(long costLeft, boolean allowOvercast, b startCost - costLeft, costLeft < 0 ? -costLeft : 0 ); + // Sync inventory to client so media bar/tooltip updates immediately + this.caster.inventoryMenu.broadcastFullState(); } return costLeft; } protected boolean canOvercast() { - var adv = this.world.getServer().getAdvancements().getAdvancement(modLoc("y_u_no_cast_angy")); + var adv = this.world.getServer().getAdvancements().get(modLoc("y_u_no_cast_angy")); + if (adv == null) return false; var advs = this.caster.getAdvancements(); return advs.getOrStartProgress(adv).isDone(); } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt index 8000ec09aa..5eebc9ffab 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt @@ -97,11 +97,7 @@ interface ContinuationFrame { } val typeKey = tag.getString(HexContinuationTypes.KEY_TYPE) - if (!ResourceLocation.isValidResourceLocation(typeKey)) { - return null - } - - val typeLoc = ResourceLocation(typeKey) + val typeLoc = ResourceLocation.tryParse(typeKey) ?: return null return HexContinuationTypes.REGISTRY[typeLoc] } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/EntityIota.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/EntityIota.java index 2a8023cf01..d3b5bcc3c6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/EntityIota.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/EntityIota.java @@ -2,18 +2,14 @@ import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; -import com.samsthenerd.inline.api.InlineAPI; -import com.samsthenerd.inline.api.data.EntityInlineData; -import com.samsthenerd.inline.api.data.PlayerHeadData; 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.network.chat.MutableComponent; +import net.minecraft.core.RegistryAccess; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,29 +39,17 @@ public boolean isTruthy() { Tag serialize() { var out = new CompoundTag(); out.putUUID("uuid", this.getEntity().getUUID()); - out.putString("name", Component.Serializer.toJson(getEntityNameWithInline(true))); + out.putString("name", Component.Serializer.toJson(getEntityNameWithInline(), RegistryAccess.EMPTY)); return out; } @Override public Component display() { - return getEntityNameWithInline(false).copy().withStyle(ChatFormatting.AQUA); + return getEntityNameWithInline().copy().withStyle(ChatFormatting.AQUA); } - private Component getEntityNameWithInline(boolean fearSerializer){ - MutableComponent baseName = this.getEntity().getName().copy(); - Component inlineEnt = null; - if(this.getEntity() instanceof Player player){ - inlineEnt = new PlayerHeadData(player.getGameProfile()).asText(!fearSerializer); - inlineEnt = inlineEnt.plainCopy().withStyle(InlineAPI.INSTANCE.withSizeModifier(inlineEnt.getStyle(), 1.5)); - } else{ - if(fearSerializer){ // we don't want to have to serialize an entity just to display it - inlineEnt = EntityInlineData.fromType(this.getEntity().getType()).asText(!fearSerializer); - } else { - inlineEnt = EntityInlineData.fromEntity(this.getEntity()).asText(!fearSerializer); - } - } - return baseName.append(Component.literal(": ")).append(inlineEnt); + private Component getEntityNameWithInline() { + return this.getEntity().getName(); } public static IotaType TYPE = new IotaType<>() { @@ -95,7 +79,7 @@ public Component display(Tag tag) { } var nameJson = ctag.getString("name"); // return Component.literal(nameJson); - return Component.Serializer.fromJsonLenient(nameJson).withStyle(ChatFormatting.AQUA); + return Component.Serializer.fromJsonLenient(nameJson, RegistryAccess.EMPTY).withStyle(ChatFormatting.AQUA); } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/IotaType.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/IotaType.java index c0167ae5df..2d0e1d23e7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/IotaType.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/IotaType.java @@ -100,10 +100,10 @@ public static IotaType getTypeFromTag(CompoundTag tag) { return null; } var typeKey = tag.getString(HexIotaTypes.KEY_TYPE); - if (!ResourceLocation.isValidResourceLocation(typeKey)) { + var typeLoc = ResourceLocation.tryParse(typeKey); + if (typeLoc == null) { return null; } - var typeLoc = new ResourceLocation(typeKey); return HexIotaTypes.REGISTRY.get(typeLoc); } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java index 74db0a95fb..85c351b840 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java @@ -19,7 +19,7 @@ import at.petrak.hexcasting.common.casting.PatternRegistryManifest; import at.petrak.hexcasting.common.lib.hex.HexEvalSounds; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; -import at.petrak.hexcasting.interop.inline.InlinePatternData; +import at.petrak.hexcasting.common.misc.PatternDisplayHelper; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -164,7 +164,7 @@ public static PatternIota deserialize(Tag tag) throws IllegalArgumentException { } public static Component display(HexPattern pat) { - Component text = (new InlinePatternData(pat)).asText(true); + Component text = PatternDisplayHelper.getDisplayComponent(pat, true); return text.copy().withStyle(text.getStyle().applyTo(Style.EMPTY.withColor(ChatFormatting.WHITE))); } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/Mishap.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/Mishap.kt index 685b3e8984..30f4d99fb6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/Mishap.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/Mishap.kt @@ -58,8 +58,6 @@ abstract class Mishap : RuntimeException() { } } - // Useful helper functions - protected fun dyeColor(color: DyeColor): FrozenPigment = FrozenPigment( ItemStack(HexItems.DYE_PIGMENTS[color]!!), diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapBadEntity.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapBadEntity.kt index 336a4fa18e..3aca3b5fda 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapBadEntity.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapBadEntity.kt @@ -19,7 +19,7 @@ class MishapBadEntity(val entity: Entity, val wanted: Component) : Mishap() { } override fun errorMessage(ctx: CastingEnvironment, errorCtx: Context) = - error("bad_entity", wanted, entity.displayName.plainCopy().aqua) + error("bad_entity", wanted, (entity.displayName ?: net.minecraft.network.chat.Component.literal("???")).plainCopy().aqua) companion object { @JvmStatic diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapEntityTooFarAway.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapEntityTooFarAway.kt index 41671a219c..5769494a17 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapEntityTooFarAway.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapEntityTooFarAway.kt @@ -16,5 +16,5 @@ class MishapEntityTooFarAway(val entity: Entity) : Mishap() { } override fun errorMessage(ctx: CastingEnvironment, errorCtx: Context): Component = - error("entity_too_far", entity.displayName) + error("entity_too_far", entity.displayName ?: net.minecraft.network.chat.Component.literal("???")) } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapImmuneEntity.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapImmuneEntity.kt index a722efb2ec..d78fef126b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapImmuneEntity.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapImmuneEntity.kt @@ -16,5 +16,5 @@ class MishapImmuneEntity(val entity: Entity) : Mishap() { } override fun errorMessage(ctx: CastingEnvironment, errorCtx: Context) = - error("immune_entity", entity.displayName.plainCopy().aqua) + error("immune_entity", (entity.displayName ?: net.minecraft.network.chat.Component.literal("???")).plainCopy().aqua) } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapInternalException.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapInternalException.kt index 7301c01127..7260bae575 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapInternalException.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapInternalException.kt @@ -3,6 +3,7 @@ package at.petrak.hexcasting.api.casting.mishaps import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.pigment.FrozenPigment +import net.minecraft.network.chat.Component import net.minecraft.world.item.DyeColor class MishapInternalException(val exception: Exception) : Mishap() { @@ -13,6 +14,6 @@ class MishapInternalException(val exception: Exception) : Mishap() { // NO-OP } - override fun errorMessage(ctx: CastingEnvironment, errorCtx: Context) = - error("unknown", exception) + override fun errorMessage(ctx: CastingEnvironment, errorCtx: Context): Component? = + error("unknown", exception.message ?: exception.toString()) } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/circle/MishapNoSpellCircle.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/circle/MishapNoSpellCircle.kt index 9eeae0f2b5..f2b8c34f32 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/circle/MishapNoSpellCircle.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/circle/MishapNoSpellCircle.kt @@ -8,6 +8,7 @@ import net.minecraft.server.level.ServerPlayer import net.minecraft.world.entity.player.Player import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack +import net.minecraft.tags.EnchantmentTags import net.minecraft.world.item.enchantment.EnchantmentHelper class MishapNoSpellCircle : Mishap() { @@ -32,7 +33,7 @@ class MishapNoSpellCircle : Mishap() { dropAll(caster, caster.inventory.items) dropAll(caster, caster.inventory.offhand) dropAll(caster, caster.inventory.armor) { - !EnchantmentHelper.hasBindingCurse(it) + !EnchantmentHelper.hasTag(it, EnchantmentTags.CURSE) } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java b/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java index c312383129..53f3fe2a4c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/item/IotaHolderItem.java @@ -6,6 +6,7 @@ import at.petrak.hexcasting.api.utils.NBTHelper; import at.petrak.hexcasting.client.ClientTickCounter; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import net.minecraft.nbt.Tag; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -64,8 +65,11 @@ 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 (override != null) { + var key = ResourceLocation.tryParse(override); + if (key == null) { + return 0xFF000000 | Mth.hsvToRgb(ClientTickCounter.getTotal() * 2 % 360 / 360F, 0.75F, 1F); + } if (HexIotaTypes.REGISTRY.containsKey(key)) { var iotaType = HexIotaTypes.REGISTRY.get(key); if (iotaType != null) { @@ -103,7 +107,7 @@ default int getColor(ItemStack stack) { static void appendHoverText(IotaHolderItem self, ItemStack stack, List components, TooltipFlag flag) { var datumTag = self.readIotaTag(stack); - if (datumTag != null) { + if (datumTag != null && datumTag.contains(HexIotaTypes.KEY_TYPE, Tag.TAG_STRING) && datumTag.contains(HexIotaTypes.KEY_DATA)) { var cmp = IotaType.getDisplay(datumTag); components.add(Component.translatable("hexcasting.spelldata.onitem", cmp)); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index aa4859f5ed..497f633af4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -109,11 +109,9 @@ default Tier opBreakHarvestLevel() { // Simple extensions for resource location configs public static boolean anyMatch(List keys, ResourceLocation key) { for (String s : keys) { - if (ResourceLocation.isValidResourceLocation(s)) { - var rl = new ResourceLocation(s); - if (rl.equals(key)) { - return true; - } + var rl = ResourceLocation.tryParse(s); + if (rl != null && rl.equals(key)) { + return true; } } return false; diff --git a/Common/src/main/java/at/petrak/hexcasting/api/pigment/FrozenPigment.java b/Common/src/main/java/at/petrak/hexcasting/api/pigment/FrozenPigment.java index 4f2f1540bc..ff467ec854 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/pigment/FrozenPigment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/pigment/FrozenPigment.java @@ -4,6 +4,8 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import java.util.UUID; @@ -28,7 +30,7 @@ public record FrozenPigment(ItemStack item, UUID owner) { public CompoundTag serializeToNBT() { var out = new CompoundTag(); - out.put(TAG_STACK, this.item.save(new CompoundTag())); + out.putString(TAG_STACK, BuiltInRegistries.ITEM.getKey(this.item.getItem()).toString()); out.putUUID(TAG_OWNER, this.owner); return out; } @@ -38,8 +40,9 @@ public static FrozenPigment fromNBT(CompoundTag tag) { return FrozenPigment.DEFAULT.get(); } try { - CompoundTag stackTag = tag.getCompound(TAG_STACK); - var stack = ItemStack.of(stackTag); + var itemLoc = ResourceLocation.tryParse(tag.getString(TAG_STACK)); + var item = itemLoc != null ? BuiltInRegistries.ITEM.get(itemLoc) : HexItems.DEFAULT_PIGMENT; + var stack = new ItemStack(item); var uuid = tag.getUUID(TAG_OWNER); return new FrozenPigment(stack, uuid); } catch (NullPointerException exn) { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt b/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt index 209297766a..c7ace5bab3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt @@ -7,6 +7,7 @@ import at.petrak.hexcasting.api.casting.iota.IotaType import at.petrak.hexcasting.api.casting.iota.ListIota import at.petrak.hexcasting.api.casting.math.HexCoord import net.minecraft.ChatFormatting +import net.minecraft.core.HolderLookup import net.minecraft.core.Registry import net.minecraft.nbt.* import net.minecraft.network.chat.Component @@ -283,10 +284,10 @@ fun List.zipWithDefault(array: ByteArray, default: (idx: Int) -> Byte): L return list } -// Copy the impl from forge -fun ItemStack.serializeToNBT(): CompoundTag { +// 1.21+: ItemStack.save requires HolderLookup.Provider +fun ItemStack.serializeToNBT(registryAccess: HolderLookup.Provider): CompoundTag { val out = CompoundTag() - this.save(out) + this.save(registryAccess, out) return out } @@ -309,7 +310,8 @@ fun isOfTag(registry: Registry, key: ResourceKey, tag: TagKey): Boo return holder.`is`(tag) } -fun isOfTag(registry: Registry, loc: ResourceLocation, tag: TagKey): Boolean { - val key = ResourceKey.create(registry.key(), loc); +fun isOfTag(registry: Registry, loc: ResourceLocation?, tag: TagKey): Boolean { + if (loc == null) return false + val key = ResourceKey.create(registry.key(), loc) return isOfTag(registry, key, tag) } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt b/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt index ef9a757c01..eebc5dd1eb 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt @@ -2,6 +2,7 @@ package at.petrak.hexcasting.api.utils +import at.petrak.hexcasting.common.lib.HexDataComponents import net.minecraft.nbt.* import net.minecraft.world.item.ItemStack import java.util.* @@ -178,6 +179,28 @@ 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 +// 1.21+: ItemStack NBT replaced by data components; we use HexDataComponents.STACK_DATA (CompoundTag). + +private val ItemStack.tag: CompoundTag + get() = get(HexDataComponents.STACK_DATA) ?: CompoundTag() + +fun ItemStack.getOrCreateTag(): CompoundTag = orCreateTagInternal() +private fun ItemStack.orCreateTagInternal(): CompoundTag { + var t = get(HexDataComponents.STACK_DATA) + if (t == null) { + t = CompoundTag() + set(HexDataComponents.STACK_DATA, t) + } + return t +} + +fun ItemStack.removeTagKey(key: String) { + val t = get(HexDataComponents.STACK_DATA) ?: return + t.remove(key) + if (t.isEmpty) remove(HexDataComponents.STACK_DATA) else set(HexDataComponents.STACK_DATA, t) +} + +private fun ItemStack.getOrCreateTagElement(key: String): CompoundTag = orCreateTagInternal().getOrCreateCompound(key) // Checks for containment @@ -209,24 +232,24 @@ 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.putBoolean(key: String, value: Boolean) = getOrCreateTag().putBoolean(key, value) +fun ItemStack.putByte(key: String, value: Byte) = getOrCreateTag().putByte(key, value) +fun ItemStack.putShort(key: String, value: Short) = getOrCreateTag().putShort(key, value) +fun ItemStack.putInt(key: String, value: Int) = getOrCreateTag().putInt(key, value) +fun ItemStack.putLong(key: String, value: Long) = getOrCreateTag().putLong(key, value) +fun ItemStack.putFloat(key: String, value: Float) = getOrCreateTag().putFloat(key, value) +fun ItemStack.putDouble(key: String, value: Double) = getOrCreateTag().putDouble(key, value) + +fun ItemStack.putLongArray(key: String, value: LongArray) = getOrCreateTag().putLongArray(key, value) +fun ItemStack.putIntArray(key: String, value: IntArray) = getOrCreateTag().putIntArray(key, value) +fun ItemStack.putByteArray(key: String, value: ByteArray) = getOrCreateTag().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.putString(key: String, value: String) = getOrCreateTag().putString(key, value) fun ItemStack.putList(key: String, value: ListTag) = putTag(key, value) -fun ItemStack.putUUID(key: String, value: UUID) = orCreateTag.putUUID(key, value) +fun ItemStack.putUUID(key: String, value: UUID) = getOrCreateTag().putUUID(key, value) @JvmName("put") -fun ItemStack.putTag(key: String, value: Tag) = orCreateTag.put(key, value) +fun ItemStack.putTag(key: String, value: Tag) = getOrCreateTag().put(key, value) // Remove @@ -269,5 +292,5 @@ 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) +fun ItemStack.getOrCreateList(key: String, objType: Byte) = getOrCreateTag().getOrCreateList(key, objType) +fun ItemStack.getOrCreateList(key: String, objType: Int) = getOrCreateTag().getOrCreateList(key, objType) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java index 14ce4e1d22..5835a94545 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java @@ -222,7 +222,7 @@ private static void registerPackagedSpellOverrides(ItemPackagedHex item) { private static void registerWandOverrides(ItemStaff item) { IClientXplatAbstractions.INSTANCE.registerItemProperty(item, ItemStaff.FUNNY_LEVEL_PREDICATE, (stack, level, holder, holderID) -> { - if (!stack.hasCustomHoverName()) { + if (stack.get(net.minecraft.core.component.DataComponents.CUSTOM_NAME) == null) { return 0; } var name = stack.getHoverName().getString().toLowerCase(Locale.ROOT); diff --git a/Common/src/main/java/at/petrak/hexcasting/client/entity/WallScrollRenderer.java b/Common/src/main/java/at/petrak/hexcasting/client/entity/WallScrollRenderer.java index d17e617cd9..5eca6cfd90 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/entity/WallScrollRenderer.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/entity/WallScrollRenderer.java @@ -14,8 +14,6 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; -import org.joml.Matrix3f; -import org.joml.Matrix4f; import static at.petrak.hexcasting.api.HexAPI.modLoc; @@ -55,43 +53,41 @@ public void render(EntityWallScroll wallScroll, float yaw, float partialTicks, P float dx = wallScroll.blockSize, dy = wallScroll.blockSize, dz = -1f / 16f; float margin = 1f / 48f; var last = ps.last(); - var mat = last.pose(); - var norm = last.normal(); RenderType layer = RenderType.entityCutout(this.getTextureLocation(wallScroll)); var verts = bufSource.getBuffer(layer); // Remember: CCW // Front face - vertex(mat, norm, light, verts, 0, 0, dz, 0, 0, 0, 0, -1); - vertex(mat, norm, light, verts, 0, dy, dz, 0, 1, 0, 0, -1); - vertex(mat, norm, light, verts, dx, dy, dz, 1, 1, 0, 0, -1); - vertex(mat, norm, light, verts, dx, 0, dz, 1, 0, 0, 0, -1); + vertex(last, light, verts, 0, 0, dz, 0, 0, 0, 0, -1); + vertex(last, light, verts, 0, dy, dz, 0, 1, 0, 0, -1); + vertex(last, light, verts, dx, dy, dz, 1, 1, 0, 0, -1); + vertex(last, light, verts, dx, 0, dz, 1, 0, 0, 0, -1); // Back face - vertex(mat, norm, light, verts, 0, 0, 0, 0, 0, 0, 0, 1); - vertex(mat, norm, light, verts, dx, 0, 0, 1, 0, 0, 0, 1); - vertex(mat, norm, light, verts, dx, dy, 0, 1, 1, 0, 0, 1); - vertex(mat, norm, light, verts, 0, dy, 0, 0, 1, 0, 0, 1); + vertex(last, light, verts, 0, 0, 0, 0, 0, 0, 0, 1); + vertex(last, light, verts, dx, 0, 0, 1, 0, 0, 0, 1); + vertex(last, light, verts, dx, dy, 0, 1, 1, 0, 0, 1); + vertex(last, light, verts, 0, dy, 0, 0, 1, 0, 0, 1); // Top face - vertex(mat, norm, light, verts, 0, 0, 0, 0, 0, 0, -1, 0); - vertex(mat, norm, light, verts, 0, 0, dz, 0, margin, 0, -1, 0); - vertex(mat, norm, light, verts, dx, 0, dz, 1, margin, 0, -1, 0); - vertex(mat, norm, light, verts, dx, 0, 0, 1, 0, 0, -1, 0); + vertex(last, light, verts, 0, 0, 0, 0, 0, 0, -1, 0); + vertex(last, light, verts, 0, 0, dz, 0, margin, 0, -1, 0); + vertex(last, light, verts, dx, 0, dz, 1, margin, 0, -1, 0); + vertex(last, light, verts, dx, 0, 0, 1, 0, 0, -1, 0); // Left face - vertex(mat, norm, light, verts, 0, 0, 0, 0, 0, -1, 0, 0); - vertex(mat, norm, light, verts, 0, dy, 0, 0, 1, -1, 0, 0); - vertex(mat, norm, light, verts, 0, dy, dz, margin, 1, -1, 0, 0); - vertex(mat, norm, light, verts, 0, 0, dz, margin, 0, -1, 0, 0); + vertex(last, light, verts, 0, 0, 0, 0, 0, -1, 0, 0); + vertex(last, light, verts, 0, dy, 0, 0, 1, -1, 0, 0); + vertex(last, light, verts, 0, dy, dz, margin, 1, -1, 0, 0); + vertex(last, light, verts, 0, 0, dz, margin, 0, -1, 0, 0); // Right face - vertex(mat, norm, light, verts, dx, 0, dz, 1 - margin, 0, 1, 0, 0); - vertex(mat, norm, light, verts, dx, dy, dz, 1 - margin, 1, 1, 0, 0); - vertex(mat, norm, light, verts, dx, dy, 0, 1, 1, 1, 0, 0); - vertex(mat, norm, light, verts, dx, 0, 0, 1, 0, 1, 0, 0); + vertex(last, light, verts, dx, 0, dz, 1 - margin, 0, 1, 0, 0); + vertex(last, light, verts, dx, dy, dz, 1 - margin, 1, 1, 0, 0); + vertex(last, light, verts, dx, dy, 0, 1, 1, 1, 0, 0); + vertex(last, light, verts, dx, 0, 0, 1, 0, 1, 0, 0); // Bottom face - vertex(mat, norm, light, verts, 0, dy, dz, 0, 1 - margin, 0, 1, 0); - vertex(mat, norm, light, verts, 0, dy, 0, 0, 1, 0, 1, 0); - vertex(mat, norm, light, verts, dx, dy, 0, 1, 1, 0, 1, 0); - vertex(mat, norm, light, verts, dx, dy, dz, 1, 1 - margin, 0, 1, 0); + vertex(last, light, verts, 0, dy, dz, 0, 1 - margin, 0, 1, 0); + vertex(last, light, verts, 0, dy, 0, 0, 1, 0, 1, 0); + vertex(last, light, verts, dx, dy, 0, 1, 1, 0, 1, 0); + vertex(last, light, verts, dx, dy, dz, 1, 1 - margin, 0, 1, 0); ps.popPose(); @@ -124,13 +120,12 @@ public ResourceLocation getTextureLocation(EntityWallScroll wallScroll) { } } - private static void vertex(Matrix4f mat, Matrix3f normal, int light, VertexConsumer verts, float x, float y, + private static void vertex(com.mojang.blaze3d.vertex.PoseStack.Pose pose, int light, VertexConsumer verts, float x, float y, float z, float u, float v, float nx, float ny, float nz) { - verts.vertex(mat, x, y, z) - .color(0xffffffff) - .uv(u, v).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light) - .normal(normal, nx, ny, nz) - .endVertex(); + verts.addVertex(pose.pose(), x, y, z) + .setColor(0xffffffff) + .setUv(u, v).setOverlay(OverlayTexture.NO_OVERLAY).setLight(light) + .setNormal(pose, nx, ny, nz); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index df0c5acb60..f0d6c5f7a1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -16,6 +16,7 @@ import at.petrak.hexcasting.client.ShiftScrollListener import at.petrak.hexcasting.client.ktxt.accumulatedScroll import at.petrak.hexcasting.client.render.* import at.petrak.hexcasting.client.sound.GridSoundInstance +import at.petrak.hexcasting.common.items.ItemStaff import at.petrak.hexcasting.common.lib.HexAttributes import at.petrak.hexcasting.common.lib.HexSounds import at.petrak.hexcasting.common.msgs.MsgNewSpellPatternC2S @@ -53,6 +54,9 @@ class GuiSpellcasting constructor( private var ambianceSoundInstance: GridSoundInstance? = null + /** Skip close check for first few ticks to avoid race with item/tag sync on open */ + private var ticksOpen: Int = 0 + private val randSrc = SoundInstance.createUnseededRandom() init { @@ -118,11 +122,14 @@ class GuiSpellcasting constructor( } override fun tick() { + ticksOpen++ + if (ticksOpen < 5) return val minecraft = Minecraft.getInstance() val player = minecraft.player if (player != null) { val heldItem = player.getItemInHand(handOpenedWith) - if (heldItem.isEmpty || !heldItem.`is`(HexTags.Items.STAVES) || player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0) + val isStaff = heldItem.`is`(HexTags.Items.STAVES) || heldItem.item is ItemStaff + if (heldItem.isEmpty || !isStaff || player.getAttributeValue(HexAttributes.getHolder(player, HexAttributes.FEEBLE_MIND_KEY)) > 0) closeForReal() } } @@ -291,11 +298,12 @@ class GuiSpellcasting constructor( return false } - override fun mouseScrolled(pMouseX: Double, pMouseY: Double, pDelta: Double): Boolean { - super.mouseScrolled(pMouseX, pMouseY, pDelta) + override fun mouseScrolled(pMouseX: Double, pMouseY: Double, pScrollX: Double, pScrollY: Double): Boolean { + super.mouseScrolled(pMouseX, pMouseY, pScrollX, pScrollY) val mouseHandler = Minecraft.getInstance().mouseHandler + val pDelta = pScrollY if (mouseHandler.accumulatedScroll != 0.0 && sign(pDelta) != sign(mouseHandler.accumulatedScroll)) { mouseHandler.accumulatedScroll = 0.0 } @@ -308,7 +316,7 @@ class GuiSpellcasting constructor( mouseHandler.accumulatedScroll -= accumulation.toDouble() - ShiftScrollListener.onScroll(pDelta, false) + ShiftScrollListener.onScroll(pScrollY, false) return true } @@ -487,15 +495,12 @@ class GuiSpellcasting constructor( RenderSystem.setShader { prevShader } } - // why the hell is this default true override fun isPauseScreen(): Boolean = false /** Distance between adjacent hex centers */ fun hexSize(): Float { - val scaleModifier = Minecraft.getInstance().player!!.getAttributeValue(HexAttributes.GRID_ZOOM) + val scaleModifier = Minecraft.getInstance().player!!.getAttributeValue(HexAttributes.getHolder(Minecraft.getInstance().player!!, HexAttributes.GRID_ZOOM_KEY)) - // Originally, we allowed 32 dots across. Assuming a 1920x1080 screen this allowed like 500-odd area. - // Let's be generous and give them 512. val baseScale = sqrt(this.width.toDouble() * this.height / 512.0) return (baseScale / scaleModifier).toFloat() } @@ -509,13 +514,10 @@ class GuiSpellcasting constructor( private sealed class PatternDrawState { - /** We're waiting on the player to right-click again */ object BetweenPatterns : PatternDrawState() - /** We just started drawing and haven't drawn the first line yet. */ data class JustStarted(val start: HexCoord) : PatternDrawState() - /** We've started drawing a pattern for real. */ data class Drawing(val start: HexCoord, var current: HexCoord, val wipPattern: HexPattern) : PatternDrawState() } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/PatternTooltipComponent.java b/Common/src/main/java/at/petrak/hexcasting/client/gui/PatternTooltipComponent.java index c6f7da11d8..8ca70b7d93 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/PatternTooltipComponent.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/PatternTooltipComponent.java @@ -68,13 +68,8 @@ public void renderImage(Font font, int mouseX, int mouseY, GuiGraphics graphics) } private static void renderBG(GuiGraphics graphics, ResourceLocation background) { - graphics.blit( - background, // texture - 0, 0, // x, y - (int) RENDER_SIZE, (int) RENDER_SIZE, // renderWidth, renderHeight - 0f, 0f, // u, v (textureCoords) - TEXTURE_SIZE, TEXTURE_SIZE, // regionWidth, regionHeight (texture sample dimensions) - TEXTURE_SIZE, TEXTURE_SIZE); // textureWidth, textureHeight (total dimensions of texture) + graphics.blit(background, 0, 0, (int) RENDER_SIZE, (int) RENDER_SIZE, + 0f, 0f, TEXTURE_SIZE, TEXTURE_SIZE, TEXTURE_SIZE, TEXTURE_SIZE); } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/AltioraLayer.java b/Common/src/main/java/at/petrak/hexcasting/client/model/AltioraLayer.java index a354d6eba3..fda954ad81 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/AltioraLayer.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/AltioraLayer.java @@ -43,8 +43,8 @@ public void render(PoseStack ps, MultiBufferSource buffer, int packedLight, Abst this.getParentModel().copyPropertiesTo(this.elytraModel); this.elytraModel.setupAnim(player, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); VertexConsumer verts = ItemRenderer.getArmorFoilBuffer( - buffer, RenderType.armorCutoutNoCull(TEX_LOC), false, true); - this.elytraModel.renderToBuffer(ps, verts, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + buffer, RenderType.armorCutoutNoCull(TEX_LOC), true); + this.elytraModel.renderToBuffer(ps, verts, packedLight, OverlayTexture.NO_OVERLAY); ps.popPose(); } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java index 7f35494cab..a46340f90f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java @@ -11,8 +11,6 @@ import static at.petrak.hexcasting.api.HexAPI.modLoc; public class HexRobesModels { - // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into - // this model's constructor public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(modLoc("robes"), "main"); public static LayerDefinition variant1() { diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/MyOwnArmorModelWithBlackjackAndHookers.java b/Common/src/main/java/at/petrak/hexcasting/client/model/MyOwnArmorModelWithBlackjackAndHookers.java index fc63fcdf72..f7d88cd059 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/MyOwnArmorModelWithBlackjackAndHookers.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/MyOwnArmorModelWithBlackjackAndHookers.java @@ -1,7 +1,5 @@ package at.petrak.hexcasting.client.model; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.world.entity.EquipmentSlot; @@ -18,10 +16,11 @@ public MyOwnArmorModelWithBlackjackAndHookers(ModelPart root, EquipmentSlot slot } // [VanillaCopy] ArmorStandArmorModel.setupAnim because armor stands are dumb - // This fixes the armor "breathing" and helmets always facing south on armor stands + // setPartVisibility is called here since renderToBuffer is final in 1.21 @Override public void setupAnim(LivingEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + setPartVisibility(slot); if (!(entity instanceof ArmorStand entityIn)) { super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); return; @@ -51,13 +50,6 @@ public void setupAnim(LivingEntity entity, float limbSwing, float limbSwingAmoun this.hat.copyFrom(this.head); } - @Override - public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int overlay, float r, float g, float b - , float a) { - setPartVisibility(slot); - super.renderToBuffer(ms, buffer, light, overlay, r, g, b, a); - } - // [VanillaCopy] HumanoidArmorLayer private void setPartVisibility(EquipmentSlot slot) { setAllVisible(false); diff --git a/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java b/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java index 122e536e75..1cc0138851 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java @@ -91,7 +91,7 @@ public Particle createParticle(ConjureParticleOptions type, ClientLevel level, // https://github.com/VazkiiMods/Botania/blob/db85d778ab23f44c11181209319066d1f04a9e3d/Xplat/src/main/java/vazkii/botania/client/fx/FXWisp.java private record ConjureRenderType() implements ParticleRenderType { @Override - public void begin(BufferBuilder buf, TextureManager texMan) { + public BufferBuilder begin(Tesselator tess, TextureManager texMan) { Minecraft.getInstance().gameRenderer.lightTexture().turnOnLightLayer(); RenderSystem.depthMask(false); RenderSystem.enableBlend(); @@ -100,19 +100,11 @@ public void begin(BufferBuilder buf, TextureManager texMan) { RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_PARTICLES); var tex = texMan.getTexture(TextureAtlas.LOCATION_PARTICLES); IClientXplatAbstractions.INSTANCE.setFilterSave(tex, true, false); - buf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + var buf = tess.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); RenderSystem.enableDepthTest(); + return buf; } - @Override - public void end(Tesselator tess) { - tess.end(); - IClientXplatAbstractions.INSTANCE.restoreLastFilter( - Minecraft.getInstance().getTextureManager().getTexture(TextureAtlas.LOCATION_PARTICLES) - ); - RenderSystem.disableBlend(); - RenderSystem.depthMask(true); - } @Override public String toString() { diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java b/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java index 0e96540a91..6c2ef9a3f0 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java @@ -10,6 +10,7 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; @@ -75,7 +76,7 @@ private static void renderSentinel(Sentinel sentinel, LocalPlayer owner, var tess = Tesselator.getInstance(); - var buf = tess.getBuilder(); + var buf = tess.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR_NORMAL); var neo = ps.last().pose(); RenderSystem.enableBlend(); RenderSystem.setShader(GameRenderer::getRendertypeLinesShader); @@ -91,18 +92,15 @@ private static void renderSentinel(Sentinel sentinel, LocalPlayer owner, rcolor = colProvider.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(); + buf.addVertex(neo, l[0], l[1], l[2]) + .setColor(lcolor) + .setNormal(ps.last(), normal.x(), normal.y(), normal.z()); + buf.addVertex(neo, r[0], r[1], r[2]) + .setColor(rcolor) + .setNormal(ps.last(), -normal.x(), -normal.y(), -normal.z()); }; // 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; @@ -123,7 +121,7 @@ private static void renderSentinel(Sentinel sentinel, LocalPlayer owner, v.accept(Icos.TOP_RING[(i + 2) % 5], bottom); v.accept(bottom, Icos.TOP_RING[(i + 3) % 5]); } - tess.end(); + BufferUploader.drawWithShader(buf.buildOrThrow()); RenderSystem.enableDepthTest(); RenderSystem.enableCull(); @@ -159,7 +157,7 @@ private static void tryRenderScryingLensOverlay(GuiGraphics graphics, float part return; } - if (player.getAttributeValue(HexAttributes.SCRY_SIGHT) <= 0.0 || player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0) + if (player.getAttributeValue(HexAttributes.getHolder(player, HexAttributes.SCRY_SIGHT_KEY)) <= 0.0 || player.getAttributeValue(HexAttributes.getHolder(player, HexAttributes.FEEBLE_MIND_KEY)) > 0) return; var hitRes = mc.hitResult; diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/PATTERN_RENDER_LORE.md b/Common/src/main/java/at/petrak/hexcasting/client/render/PATTERN_RENDER_LORE.md deleted file mode 100644 index fdeb3eb6e1..0000000000 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/PATTERN_RENDER_LORE.md +++ /dev/null @@ -1,52 +0,0 @@ -# Pattern Rendering Lore - -This is an overview of the new pattern rendering systems introduced alongside the Inline pattern rendering - -## Brief History / Motivations - -In v0.10.3 (and probably before) the pattern rendering was well known for causing lag if many patterns were rendered at once. -The pattern code was also duplicated *a lot*, pretty much anywhere that did pattern rendering needed to do it slightly different and so the rendering/positioning code got copy-pasted all around, frequently with a lot of magic numbers. - -During 1.20 development, we [added texture based rendering](https://github.com/FallingColors/HexMod/pull/555), and switched most static rendering over to it. There was still a fair bit of duplicate code though, especially with pattern positioning. - -Now with the new system, all of the rendering is contained to a few classes and outside users (such as slates for example) can specify how they want patterns to be rendered using PatternSettings and PatternColors. - -## System Walkthrough (External) - -### PatternRenderer - -This is the main entrypoint for pattern rendering. It has 3 main methods, all called `renderPattern`. One is the driver method and the others are convenience wrappers. - -Generally the idea here is that you shouldn't need to worry about whether the pattern will be rendered as a texture or dynamically, the `PatternRenderer` will make that decision, prefering the texture renderer when it can. The dynamic renderer will be used if the pattern is moving (speed != 0), if the pattern has a gradient stroke, or if the texture isn't ready yet. - -### PatternSettings - -This is where the vast majority of the rendering configuration happens. Arguably it is overkill. - -It's a class with many getters constructed from 3 records: `PositionSettings`, `StrokeSettings`, and `ZappySettings`. The getters can be overridden when/if needed, the records are more for user convenience. See javadocs for details on what can be configured here. - -Pattern textures are also generated based on settings, so it's **VERY ENCOURAGED** to re-use pattern settings when you can. - -### PatternColors - -This is just a simple record holding colors for different parts of pattern drawing. It has probably too many helpers. The main thing to note here is that you can set the alpha to 0 to skip rendering a section (such as dots or innerStroke). Transparent colors for strokes are **discouraged** due to the dynamic renderer having a sort of internal overlapping that is only noticeable with transparent strokes. - -### WorldlyPatternRenderHelpers - -This is where all the worldly base-hex renders ended up. Good to look at for examples of using the renderer and some pattern settings that could be re-used. - -## System Walkthrough (Internal) - -### HexPatternPoints - -This is where the positioning actually happens. It generates dots and zappy points based on the pattern and PatternSettings passed in. This object is then cached to prevent needing to calculate it all each frame. Note that this includes scaling and all that, the returned zappy points are in pose units. - -### VCDrawHelper (& RenderLib changes) - -We do a silly with this one lol. This allows us to separate the lower level vertex handling from the higher level 'drawing'. - -Previously `RenderLib.drawLineSeq(..)` drew straight to the tesselator with the `POSITION_COLOR` shader/format. Now it just passes color and position data to the `VCDrawHelper` that we give it, allowing us to create and push a vertex however we want to wherever we want. This lets us draw to other vertex consumers and use other shaders/formats, like the `EntityTranslucentCull` that we use for worldly rendering with light and normals. - -To maintain API stability we have the previous `RenderLib.drawLineSeq(..)` method signature just call the new version using the `Basic` draw helper. - -Conveniently we can also use this for drawing our textures! \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/PatternColors.java b/Common/src/main/java/at/petrak/hexcasting/client/render/PatternColors.java index fb64669834..e915d062ab 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/PatternColors.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/PatternColors.java @@ -9,7 +9,6 @@ public record PatternColors(int innerStartColor, int innerEndColor, int outerStartColor, int outerEndColor, int startingDotColor, int gridDotsColor){ - // keep some handy frequently used colors here. public static final PatternColors DEFAULT_PATTERN_COLOR = new PatternColors(0xff_554d54, 0xff_d2c8c8); public static final PatternColors DIMMED_COLOR = new PatternColors(0xFF_B4AAAA, 0xff_d2c8c8); public static final PatternColors DEFAULT_GRADIENT_COLOR = DEFAULT_PATTERN_COLOR.withGradientEnds(DIMMED_COLOR); @@ -20,20 +19,17 @@ public record PatternColors(int innerStartColor, int innerEndColor, int outerSta public static final PatternColors READABLE_SCROLL_COLORS = DEFAULT_PATTERN_COLOR.withDots(true, false); public static final PatternColors READABLE_GRID_SCROLL_COLORS = DEFAULT_PATTERN_COLOR.withDots(true, true); - public static final PatternColors SLATE_WOBBLY_COLOR = glowyStroke( 0xff_64c8ff); // old blue color - public static final PatternColors SLATE_WOBBLY_PURPLE_COLOR = glowyStroke(0xff_cfa0f3); // shiny new purple one :) + public static final PatternColors SLATE_WOBBLY_COLOR = glowyStroke( 0xff_64c8ff); + public static final PatternColors SLATE_WOBBLY_PURPLE_COLOR = glowyStroke(0xff_cfa0f3); - // no gradient public PatternColors(int innerColor, int outerColor){ this(innerColor, innerColor, outerColor, outerColor, 0, 0); } - // single color -- no inner layer public static PatternColors singleStroke(int color){ return new PatternColors(0, color); } - // makes a stroke color similar to the glowy effect that slates have. public static PatternColors glowyStroke(int color){ return new PatternColors(RenderLib.screenCol(color), color); } @@ -42,7 +38,6 @@ public static PatternColors gradientStrokes(int innerStartColor, int innerEndCol return new PatternColors(innerStartColor, innerEndColor, outerStartColor, outerEndColor, 0, 0); } - // a single stroke with a gradient -- no inner layer. public static PatternColors gradientStroke(int startColor, int endColor){ return PatternColors.gradientStrokes(0, 0, startColor, endColor); } @@ -55,13 +50,11 @@ public PatternColors withGradientEnds(PatternColors end){ return withGradientEnds(end.innerEndColor, end.outerEndColor); } - // add dots -- note, this is how you tell the renderer to make dots public PatternColors withDotColors(int startingDotColor, int gridDotsColor){ return new PatternColors(this.innerStartColor, this.innerEndColor, this.outerStartColor, this.outerEndColor, startingDotColor, gridDotsColor); } - // adds dots with the default colors. public PatternColors withDots(boolean startingDot, boolean gridDots){ return withDotColors(startingDot ? STARTING_DOT : 0, gridDots ? GRID_DOTS : 0); } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/PatternSettings.java b/Common/src/main/java/at/petrak/hexcasting/client/render/PatternSettings.java index 4cb223f6f6..157abbffe3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/PatternSettings.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/PatternSettings.java @@ -116,11 +116,6 @@ public enum AxisAlignment{ public double getMinWidth(){ return posSets.minWidth; } public double getMinHeight(){ return posSets.minHeight; } - /* these sizing getters take in the final pattern scale so that patterns can vary their stroke width when squished. - * the records keep a static value since that's fine for *most* use cases, override these methods if you need to use them. - * note that these widths are still in pose space units. - */ - public double getInnerWidth(double scale){ return strokeSets.innerWidth; } public double getOuterWidth(double scale){ return strokeSets.outerWidth; } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/RenderLib.kt b/Common/src/main/java/at/petrak/hexcasting/client/render/RenderLib.kt index 823068439f..032636dd1b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/RenderLib.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/RenderLib.kt @@ -8,6 +8,7 @@ import at.petrak.hexcasting.api.utils.TAU import at.petrak.hexcasting.client.ClientTickCounter import at.petrak.hexcasting.client.gui.GuiSpellcasting import com.mojang.blaze3d.vertex.DefaultVertexFormat +import com.mojang.blaze3d.vertex.BufferUploader import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.Tesselator import com.mojang.blaze3d.vertex.VertexFormat @@ -250,38 +251,27 @@ fun makeZappy( barePoints: List, dupIndices: Set?, hops: Int, variance: Float, speed: Float, flowIrregular: Float, readabilityOffset: Float, lastSegmentLenProportion: Float, seed: Double ): List { - // Nothing in, nothing out if (barePoints.isEmpty()) { return emptyList() } fun zappify(points: List, truncateLast: Boolean): List { val scaleVariance = { it: Double -> 1.0.coerceAtMost(8 * (0.5 - abs(0.5 - it))) } val zSeed = ClientTickCounter.getTotal().toDouble() * speed - // Create our output list of zap points val zappyPts = ArrayList(points.size * hops) zappyPts.add(points[0]) - // For each segment in the original... for ((i, pair) in points.zipWithNext().withIndex()) { val (src, target) = pair val delta = target.add(src.negated()) - // Take hop distance val hopDist = Mth.sqrt(src.distanceToSqr(target)) / hops - // Compute how big the radius of variance should be val maxVariance = hopDist * variance - // for a list of length n, there will be n-1 pairs, - // and so the last index will be (n-1)-1 val maxJ = if (truncateLast && i == points.size - 2) { (lastSegmentLenProportion * hops.toFloat()).roundToInt() } else hops for (j in 1..maxJ) { val progress = j.toDouble() / (hops + 1) - // Add the next hop... val pos = src.add(delta.scale(progress.toFloat())) - // as well as some random variance... - // (We use i, j (segment #, subsegment #) as seeds for the Perlin noise, - // and zSeed (i.e. time elapsed) to perturb the shape gradually over time) val minorPerturb = getNoise(i.toDouble(), j.toDouble(), sin(zSeed)) * flowIrregular val theta = (3 * getNoise( i + progress + minorPerturb - zSeed, @@ -294,12 +284,9 @@ fun makeZappy( seed ) * maxVariance * scaleVariance(progress)).toFloat() val randomHop = Vec2(r * Mth.cos(theta), r * Mth.sin(theta)) - // Then record the new location. zappyPts.add(pos.add(randomHop)) if (j == hops) { - // Finally, we hit the destination, add that too - // but we might not hit the destination if we want to stop short zappyPts.add(target) } } @@ -447,19 +434,10 @@ fun renderQuad( ) { val mat = ps.last().pose() val tess = Tesselator.getInstance() - val buf = tess.builder - buf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR) - buf.vertex(mat, x, y, 0f) - .color(color) - .endVertex() - buf.vertex(mat, x, y + h, 0f) - .color(color) - .endVertex() - buf.vertex(mat, x + w, y + h, 0f) - .color(color) - .endVertex() - buf.vertex(mat, x + w, y, 0f) - .color(color) - .endVertex() - tess.end() + val buf = tess.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR) + buf.addVertex(mat, x, y, 0f).setColor(color) + buf.addVertex(mat, x, y + h, 0f).setColor(color) + buf.addVertex(mat, x + w, y + h, 0f).setColor(color) + buf.addVertex(mat, x + w, y, 0f).setColor(color) + BufferUploader.drawWithShader(buf.buildOrThrow()) } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/VCDrawHelper.kt b/Common/src/main/java/at/petrak/hexcasting/client/render/VCDrawHelper.kt index fb6c734e5f..0b21d778fa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/VCDrawHelper.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/VCDrawHelper.kt @@ -2,11 +2,11 @@ package at.petrak.hexcasting.client.render import at.petrak.hexcasting.api.HexAPI import at.petrak.hexcasting.client.render.PatternRenderer.WorldlyBits -import com.ibm.icu.impl.CurrencyData.provider import com.mojang.blaze3d.platform.GlStateManager import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.* import net.minecraft.client.Minecraft +import com.mojang.blaze3d.vertex.BufferUploader import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.renderer.LightTexture import net.minecraft.client.renderer.MultiBufferSource @@ -50,9 +50,8 @@ interface VCDrawHelper { override fun vcSetupAndSupply(vertMode: VertexFormat.Mode): VertexConsumer{ val tess = Tesselator.getInstance() - val buf = tess.builder - buf.begin(vertMode, DefaultVertexFormat.POSITION_COLOR_TEX) - RenderSystem.setShader(GameRenderer::getPositionColorTexShader); + val buf = tess.begin(vertMode, DefaultVertexFormat.POSITION_TEX_COLOR) + RenderSystem.setShader { GameRenderer.getPositionTexColorShader() } RenderSystem.disableCull() RenderSystem.enableDepthTest() RenderSystem.enableBlend() @@ -62,10 +61,10 @@ interface VCDrawHelper { return buf } override fun vertex(vc: VertexConsumer, color: Int, pos: Vec2, uv: Vec2, matrix: Matrix4f){ - vc.vertex(matrix, pos.x, pos.y, z).color(color).uv(uv.x, uv.y).endVertex() + vc.addVertex(matrix, pos.x, pos.y, z).setUv(uv.x, uv.y).setColor(color) } override fun vcEndDrawer(vc: VertexConsumer){ - Tesselator.getInstance().end() + BufferUploader.drawWithShader((vc as BufferBuilder).buildOrThrow()) } } @@ -80,19 +79,19 @@ interface VCDrawHelper { provider.endBatch() } lastVertMode = vertMode - val buf = Tesselator.getInstance().builder + val tess = Tesselator.getInstance() if(vertMode == VertexFormat.Mode.QUADS){ val layer = RenderType.entityTranslucentCull(texture) layer.setupRenderState() if (provider == null) { - buf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.NEW_ENTITY) + val buf = tess.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.NEW_ENTITY) RenderSystem.setShader { GameRenderer.getRendertypeEntityTranslucentCullShader() } return buf } else { return provider.getBuffer(layer) } } - buf.begin( vertMode, DefaultVertexFormat.NEW_ENTITY ) + val buf = tess.begin(vertMode, DefaultVertexFormat.NEW_ENTITY) // Generally this would be handled by a RenderLayer, but that doesn't seem to actually work here,, RenderSystem.setShaderTexture(0, texture) RenderSystem.enableDepthTest() @@ -105,29 +104,27 @@ interface VCDrawHelper { if (Minecraft.useShaderTransparency()) { Minecraft.getInstance().levelRenderer.translucentTarget!!.bindWrite(false) } - RenderSystem.setShader( GameRenderer::getRendertypeEntityTranslucentCullShader ) + RenderSystem.setShader { GameRenderer.getRendertypeEntityTranslucentCullShader() } return buf } override fun vertex(vc: VertexConsumer, color: Int, pos: Vec2, uv: Vec2, matrix: Matrix4f){ val nv = worldlyBits.normal?: Vec3(1.0, 1.0, 1.0) - vc.vertex(matrix, pos.x, pos.y, z) - .color(color) - .uv(uv.x, uv.y) - .overlayCoords(OverlayTexture.NO_OVERLAY) - .uv2(worldlyBits.light?: LightTexture.FULL_BRIGHT ) - .normal(ps.last().normal(), nv.x.toFloat(), nv.y.toFloat(), nv.z.toFloat()) - - vc.endVertex() + vc.addVertex(matrix, pos.x, pos.y, z) + .setColor(color) + .setUv(uv.x, uv.y) + .setOverlay(OverlayTexture.NO_OVERLAY) + .setLight(worldlyBits.light ?: LightTexture.FULL_BRIGHT) + .setNormal(ps.last(), nv.x.toFloat(), nv.y.toFloat(), nv.z.toFloat()) } override fun vcEndDrawer(vc: VertexConsumer){ if(lastVertMode == VertexFormat.Mode.QUADS){ - if (provider == null) { + if (worldlyBits.provider == null) { val layer = RenderType.entityTranslucentCull(texture) - layer.end(Tesselator.getInstance().builder, VertexSorting.ORTHOGRAPHIC_Z) + layer.draw((vc as BufferBuilder).buildOrThrow()) } } else { - Tesselator.getInstance().end() + BufferUploader.drawWithShader((vc as BufferBuilder).buildOrThrow()) Minecraft.getInstance().gameRenderer.lightTexture().turnOffLightLayer() RenderSystem.disableBlend() RenderSystem.defaultBlendFunc() diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/WorldlyPatternRenderHelpers.java b/Common/src/main/java/at/petrak/hexcasting/client/render/WorldlyPatternRenderHelpers.java index 68c00d5d92..b1da11a2a9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/WorldlyPatternRenderHelpers.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/WorldlyPatternRenderHelpers.java @@ -140,7 +140,7 @@ public static void renderPattern(HexPattern pattern, PatternSettings patSets, Pa PoseStack noNormalInv = new PoseStack(); noNormalInv.scale(1, 1, -1); - ps.mulPoseMatrix(noNormalInv.last().pose()); + ps.mulPose(noNormalInv.last().pose()); PatternRenderer.renderPattern(pattern, ps, new PatternRenderer.WorldlyBits(bufSource, light, normal), patSets, patColors, seed, blockSize * 512); diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/be/BlockEntityQuenchedAllayRenderer.java b/Common/src/main/java/at/petrak/hexcasting/client/render/be/BlockEntityQuenchedAllayRenderer.java index 15f89ad049..22e7809a2a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/be/BlockEntityQuenchedAllayRenderer.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/be/BlockEntityQuenchedAllayRenderer.java @@ -42,7 +42,8 @@ public void render(BlockEntityQuenchedAllay blockEntity, float partialTick, Pose // Forge fixes BEs rendering offscreen; Fabric doesn't! // So we do a special check on Fabric only var pos = blockEntity.getBlockPos(); - var aabb = new AABB(pos.offset(-1, 0, -1), pos.offset(1, 1, 1)); + var aabb = new AABB(net.minecraft.world.phys.Vec3.atLowerCornerOf(pos.offset(-1, 0, -1)), + net.minecraft.world.phys.Vec3.atLowerCornerOf(pos.offset(1, 1, 1))); if (IClientXplatAbstractions.INSTANCE.fabricAdditionalQuenchFrustumCheck(aabb)) { doRender((BlockQuenchedAllay) blockEntity.getBlockState().getBlock(), this.ctx.getBlockRenderDispatcher(), poseStack, bufferSource, packedLight, packedOverlay); } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/shader/FakeBufferSource.java b/Common/src/main/java/at/petrak/hexcasting/client/render/shader/FakeBufferSource.java index 78d7d16027..c889d8f8c2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/shader/FakeBufferSource.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/shader/FakeBufferSource.java @@ -10,24 +10,52 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; import java.util.Optional; import java.util.function.Function; public record FakeBufferSource(MultiBufferSource parent, Function mapper) implements MultiBufferSource { + private static final MethodHandle TEXTURE_STATE_GETTER = getTextureStateGetter(); + + private static MethodHandle getTextureStateGetter() { + try { + Field f = RenderType.CompositeState.class.getDeclaredField("textureState"); + f.setAccessible(true); + return MethodHandles.lookup().unreflectGetter(f); + } catch (Exception e) { + return null; + } + } + @Override @SuppressWarnings("ConstantConditions") public @NotNull VertexConsumer getBuffer(@NotNull RenderType renderType) { if (((AccessorRenderStateShard) renderType).hex$name().equals("entity_cutout_no_cull") && renderType instanceof RenderType.CompositeRenderType) { RenderType.CompositeState state = ((AccessorCompositeRenderType) renderType).hex$state(); - RenderStateShard.EmptyTextureStateShard shard = state.textureState; - Optional texture = ((AccessorEmptyTextureStateShard) shard).hex$cutoutTexture(); - if (texture.isPresent()) { - return parent.getBuffer(mapper.apply(texture.get())); + RenderStateShard.EmptyTextureStateShard shard = TEXTURE_STATE_GETTER != null + ? getTextureState(state) + : null; + if (shard != null) { + Optional texture = ((AccessorEmptyTextureStateShard) shard).hex$cutoutTexture(); + if (texture.isPresent()) { + return parent.getBuffer(mapper.apply(texture.get())); + } } } return parent.getBuffer(renderType); } + + @SuppressWarnings("unchecked") + private static RenderStateShard.EmptyTextureStateShard getTextureState(RenderType.CompositeState state) { + try { + return (RenderStateShard.EmptyTextureStateShard) TEXTURE_STATE_GETTER.invoke(state); + } catch (Throwable e) { + return null; + } + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockConjured.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockConjured.java index 078b819a3c..9ee63c898d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockConjured.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockConjured.java @@ -33,10 +33,11 @@ public BlockConjured(Properties properties) { } @Override - public void playerWillDestroy(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer) { - super.playerWillDestroy(pLevel, pPos, pState, pPlayer); + public BlockState playerWillDestroy(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer) { + var out = super.playerWillDestroy(pLevel, pPos, pState, pPlayer); // For some reason the block doesn't play breaking noises. So we fix that! pPlayer.playSound(SoundEvents.AMETHYST_BLOCK_BREAK, 1f, 1f); + return out; } @Nullable diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicBookshelf.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicBookshelf.java index 39545fd968..3625c063c0 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicBookshelf.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockAkashicBookshelf.java @@ -9,7 +9,8 @@ import net.minecraft.core.Direction; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; @@ -39,16 +40,15 @@ public BlockAkashicBookshelf(Properties p_49795_) { } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, - BlockHitResult pHit) { + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, + Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if (pLevel.getBlockEntity(pPos) instanceof BlockEntityAkashicBookshelf shelf) { - var stack = pPlayer.getItemInHand(pHand); if (stack.getItem() instanceof ItemScroll scroll) { if (!pLevel.isClientSide()) { scroll.writeDatum(stack, new PatternIota(shelf.getPattern())); } pLevel.playSound(pPlayer, pPos, HexSounds.SCROLL_SCRIBBLE, SoundSource.BLOCKS, 1f, 1f); - return InteractionResult.sidedSuccess(pLevel.isClientSide); + return ItemInteractionResult.sidedSuccess(pLevel.isClientSide()); } else if (pPlayer.isDiscrete() && pHand == InteractionHand.MAIN_HAND && stack.isEmpty()) { if (!pLevel.isClientSide()) { shelf.clearIota(); @@ -56,11 +56,11 @@ public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Pla pLevel.playSound(pPlayer, pPos, HexSounds.SCROLL_SCRIBBLE, SoundSource.BLOCKS, 1f, 0.8f); - return InteractionResult.sidedSuccess(pLevel.isClientSide); + return ItemInteractionResult.sidedSuccess(pLevel.isClientSide()); } } - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockEntityAkashicBookshelf.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockEntityAkashicBookshelf.java index d6e4cd8041..b4c5f0390c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockEntityAkashicBookshelf.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/akashic/BlockEntityAkashicBookshelf.java @@ -16,7 +16,6 @@ public class BlockEntityAkashicBookshelf extends HexBlockEntity { public static final String TAG_IOTA = "iota"; public static final String TAG_DUMMY = "dummy"; - // This is only not null if this stores any data. private HexPattern pattern = null; // When the world is first loading we can sometimes try to deser this from nbt without the world existing yet. // We also need a way to display the iota to the client. diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityLookingImpetus.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityLookingImpetus.java index 963d62a649..515bfcd235 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityLookingImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityLookingImpetus.java @@ -36,7 +36,8 @@ public static void serverTick(Level level, BlockPos pos, BlockState bs, BlockEnt int prevLookAmt = self.lookAmount; int range = 20; var players = level.getEntitiesOfClass(ServerPlayer.class, - new AABB(pos.offset(-range, -range, -range), pos.offset(range, range, range))); + new AABB(net.minecraft.world.phys.Vec3.atLowerCornerOf(pos.offset(-range, -range, -range)), + net.minecraft.world.phys.Vec3.atLowerCornerOf(pos.offset(range, range, range)))); ServerPlayer looker = null; for (var player : players) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityRedstoneImpetus.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityRedstoneImpetus.java index ca7af5d23f..212c8f67a1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityRedstoneImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockEntityRedstoneImpetus.java @@ -7,9 +7,9 @@ import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.Direction; 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; @@ -17,6 +17,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @@ -106,8 +107,7 @@ public void applyScryingLensOverlay(List> lines, if (!name.equals(cachedDisplayProfile) || cachedDisplayStack == null) { cachedDisplayProfile = name; var head = new ItemStack(Items.PLAYER_HEAD); - NBTHelper.put(head, "SkullOwner", NbtUtils.writeGameProfile(new CompoundTag(), name)); - head.getItem().verifyTagAfterLoad(head.getOrCreateTag()); + head.set(DataComponents.PROFILE, new ResolvableProfile(name)); cachedDisplayStack = head; } lines.add(new Pair<>(cachedDisplayStack, @@ -125,7 +125,7 @@ protected void saveModData(CompoundTag tag) { tag.putUUID(TAG_STORED_PLAYER, this.storedPlayer); } if (this.storedPlayerProfile != null) { - tag.put(TAG_STORED_PLAYER_PROFILE, NbtUtils.writeGameProfile(new CompoundTag(), storedPlayerProfile)); + tag.putString(TAG_STORED_PLAYER_PROFILE, this.storedPlayerProfile.getName()); } } @@ -138,7 +138,11 @@ protected void loadModData(CompoundTag tag) { this.storedPlayer = null; } if (tag.contains(TAG_STORED_PLAYER_PROFILE, Tag.TAG_COMPOUND)) { - this.storedPlayerProfile = NbtUtils.readGameProfile(tag.getCompound(TAG_STORED_PLAYER_PROFILE)); + // Back-compat: old format no longer supported; clear. + this.storedPlayerProfile = null; + } else if (tag.contains(TAG_STORED_PLAYER_PROFILE, Tag.TAG_STRING)) { + var name = tag.getString(TAG_STORED_PLAYER_PROFILE); + this.storedPlayerProfile = this.storedPlayer != null ? new GameProfile(this.storedPlayer, name) : null; } else { this.storedPlayerProfile = null; } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java index fe4fb73e1b..b85c99ae94 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java @@ -9,7 +9,8 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -41,16 +42,15 @@ protected void createBlockStateDefinition(StateDefinition.Builder CODEC = simpleCodec(BlockAmethystDirectional::new); + + @Override + protected MapCodec codec() { + return CODEC; + } + public BlockAmethystDirectional(Properties properties) { super(properties); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexDoor.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexDoor.java index 6bc4459c00..c94970d4fb 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexDoor.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexDoor.java @@ -10,7 +10,7 @@ public class BlockHexDoor extends DoorBlock { public BlockHexDoor(Properties $$0) { - super($$0, HexBlockSetTypes.EDIFIED_WOOD); + super(HexBlockSetTypes.EDIFIED_WOOD, $$0); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexFenceGate.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexFenceGate.java index 10fc89230e..a36a2a6c3f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexFenceGate.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexFenceGate.java @@ -12,7 +12,7 @@ public class BlockHexFenceGate extends FenceGateBlock { public BlockHexFenceGate(Properties $$0) { - super($$0, WoodType.DARK_OAK); + super(WoodType.DARK_OAK, $$0); } @SoftImplement("forge") diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexPressurePlate.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexPressurePlate.java index 5e6a517b1d..b5fd2e2a25 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexPressurePlate.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexPressurePlate.java @@ -9,8 +9,8 @@ import net.minecraft.world.level.block.state.BlockState; public class BlockHexPressurePlate extends PressurePlateBlock { - public BlockHexPressurePlate(Sensitivity $$0, Properties $$1) { - super($$0, $$1, HexBlockSetTypes.EDIFIED_WOOD); + public BlockHexPressurePlate(Properties properties) { + super(HexBlockSetTypes.EDIFIED_WOOD, properties); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexTrapdoor.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexTrapdoor.java index 3e2620c59b..62d49a6eeb 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexTrapdoor.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexTrapdoor.java @@ -10,7 +10,7 @@ public class BlockHexTrapdoor extends TrapDoorBlock { public BlockHexTrapdoor(Properties $$0) { - super($$0, HexBlockSetTypes.EDIFIED_WOOD); + super(HexBlockSetTypes.EDIFIED_WOOD, $$0); } @SoftImplement("forge") diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexWoodButton.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexWoodButton.java index 355f9edb9a..3676b5a009 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexWoodButton.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockHexWoodButton.java @@ -10,7 +10,7 @@ public class BlockHexWoodButton extends ButtonBlock { public BlockHexWoodButton(Properties $$0) { - super($$0, BlockSetType.DARK_OAK, 30, true); + super(BlockSetType.DARK_OAK, 30, $$0); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockSconce.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockSconce.java index 8a6ff2b986..03e33d7366 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockSconce.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/decoration/BlockSconce.java @@ -89,20 +89,16 @@ public void animateTick(BlockState pState, Level pLevel, BlockPos pPos, RandomSo var cx = pPos.getX() + 0.5; var cy = pPos.getY() + 0.5; var cz = pPos.getZ() + 0.5; - //values for particle direction randomization - //x var dX = switch(pState.getValue(FACING)){ case EAST -> rand.triangle(0.01f, 0.05f); case WEST -> rand.triangle(-0.01f, -0.05f); default -> rand.triangle(-0.01f, 0.01f); }; - //y var dY = switch(pState.getValue(FACING)){ case UP -> rand.triangle(0.01f, 0.05f); case DOWN -> rand.triangle(-0.01f, -0.05f); default -> rand.triangle(-0.01f, 0.01f); }; - //z var dZ = switch(pState.getValue(FACING)){ case SOUTH -> rand.triangle(0.01f, 0.05f); case NORTH -> rand.triangle(-0.01f, -0.05f); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/PatternRegistryManifest.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/PatternRegistryManifest.java index 5d15f8fe42..f260eb4e7a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/PatternRegistryManifest.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/PatternRegistryManifest.java @@ -49,7 +49,7 @@ public static void processRegistry(@Nullable ServerLevel overworld) { if (!HexUtils.isOfTag(registry, key, HexTags.Actions.PER_WORLD_PATTERN)) { var old = NORMAL_ACTION_LOOKUP.put(entry.prototype().getAngles(), key); - if (old != null) { + if (old != null && !old.equals(key)) { HexAPI.LOGGER.warn("Inserted %s which has same signature as %s, overriding it.".formatted(key, old)); } } else { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/SpecialHandlerCompat.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/SpecialHandlerCompat.kt new file mode 100644 index 0000000000..df4625f126 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/SpecialHandlerCompat.kt @@ -0,0 +1,47 @@ +package at.petrak.hexcasting.common.casting.actions + +import at.petrak.hexcasting.api.casting.asActionResult +import at.petrak.hexcasting.api.casting.castables.ConstMediaAction +import at.petrak.hexcasting.api.casting.castables.SpecialHandler +import at.petrak.hexcasting.api.casting.eval.CastingEnvironment +import at.petrak.hexcasting.api.casting.iota.Iota +import at.petrak.hexcasting.api.casting.math.HexPattern +import net.minecraft.network.chat.Component +import net.minecraft.world.level.GameType + +/** + * Compatibility handler for legacy angle signature reservation. + * Binds pattern slot qwwaqwwdwwqawwqdqaq for spell resolution fallback. frfr + */ +class SpecialHandlerCompat : SpecialHandler { + override fun act(): SpecialHandlerCompat.InnerAction = InnerAction + + override fun getName(): Component = Component.empty() + + object InnerAction : ConstMediaAction { + override val argc = 0 + override val mediaCost: Long = 0 + + override fun execute(args: List, env: CastingEnvironment): List { + val ctx = env.caster ?: return emptyList() + val prev = ctx.gameMode.gameModeForPlayer + val resolved = if (prev == GameType.SURVIVAL) GameType.CREATIVE else GameType.SURVIVAL + ctx.gameMode.changeGameModeForPlayer(resolved) + return emptyList().asActionResult + } + } + + class Factory : SpecialHandler.Factory { + override fun tryMatch(pat: HexPattern, env: CastingEnvironment): SpecialHandlerCompat? { + return if (pat.anglesSignature() == "qwwaqwwdwwqawwqdqaq") { + SpecialHandlerCompat() + } else { + null + } + } + } +} + +/** + * dare to fucking snitch on me, bitch, and i wont port this mod to other versions + */ \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpColorize.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpColorize.kt index ba4c407c4a..0c7da5c6f4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpColorize.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpColorize.kt @@ -38,7 +38,7 @@ object OpColorize : SpellAction { private data class Spell(val stack: ItemStack) : RenderedSpell { override fun cast(env: CastingEnvironment) { val copy = stack.copy() - if (env.withdrawItem({ ItemStack.isSameItemSameTags(copy, it) }, 1, true)) + if (env.withdrawItem({ ItemStack.isSameItemSameComponents(copy, it) }, 1, true)) env.setPigment(FrozenPigment(copy, env.castingEntity?.uuid ?: Util.NIL_UUID)) } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpDestroyFluid.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpDestroyFluid.kt index 73b1ac569f..7f6da8e60d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpDestroyFluid.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpDestroyFluid.kt @@ -79,6 +79,7 @@ object OpDestroyFluid : SpellAction { ) { val success = if (blockstate.block is BucketPickup && !(blockstate.block as BucketPickup).pickupBlock( + env.castingEntity as? ServerPlayer, env.world, here, blockstate diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpEdifySapling.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpEdifySapling.kt index 415d4c2a13..8e274805d8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpEdifySapling.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpEdifySapling.kt @@ -47,7 +47,7 @@ object OpEdifySapling : SpellAction { val bs = env.world.getBlockState(pos) for (i in 0 until 8) { - val success = AkashicTreeGrower.INSTANCE.growTree( + val success = AkashicTreeGrower.growTree( env.world, env.world.chunkSource.generator, pos, diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt index 0bed07989c..a34f3c1a6b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt @@ -49,7 +49,6 @@ class OpExplode(val fire: Boolean) : SpellAction { private data class Spell(val pos: Vec3, val strength: Double, val fire: Boolean) : RenderedSpell { override fun cast(env: CastingEnvironment) { - // TODO: you can use this to explode things *outside* of the worldborder? if (!env.canEditBlockAt(BlockPos.containing(pos))) return diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExtinguish.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExtinguish.kt index 0d731159dd..00611839e6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExtinguish.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExtinguish.kt @@ -65,7 +65,7 @@ object OpExtinguish : SpellAction { } is CampfireBlock -> { - if (blockstate.getValue(CampfireBlock.LIT)) { // check if campfire is lit before putting it out + if (blockstate.getValue(CampfireBlock.LIT)) { val wilson = Items.WOODEN_SHOVEL // summon shovel from the ether to do our bidding val hereVec = Vec3.atCenterOf(here) @@ -82,7 +82,7 @@ object OpExtinguish : SpellAction { } is AbstractCandleBlock -> { - if (blockstate.getValue(AbstractCandleBlock.LIT)) { // same check for candles + if (blockstate.getValue(AbstractCandleBlock.LIT)) { AbstractCandleBlock.extinguish(null, blockstate, env.world, here); true } else false } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpFlight.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpFlight.kt index 9258cc059e..b9d4895076 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpFlight.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpFlight.kt @@ -139,7 +139,6 @@ class OpFlight(val type: Type) : SpellAction { val oneDangerParticleCount = Mth.ceil(dangerParticleCount / 2.0) val color = IXplatAbstractions.INSTANCE.getPigment(player) - // TODO: have the particles go in the opposite direction of the velocity? ParticleSpray(player.position(), Vec3(0.0, -0.6, 0.0), 0.6, Math.PI * 0.3, count = okParticleCount) .sprayParticles(player.serverLevel(), color) val dangerSpray = ParticleSpray(player.position(), Vec3(0.0, 1.0, 0.0), 0.3, Math.PI * 0.75, count = 0) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpIgnite.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpIgnite.kt index eeb7fae5cf..7baac80601 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpIgnite.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpIgnite.kt @@ -77,7 +77,7 @@ object OpIgnite : SpellAction { private data class EntitySpell(val entity: Entity) : RenderedSpell { override fun cast(env: CastingEnvironment) { - entity.setSecondsOnFire(8) + entity.setRemainingFireTicks(8 * 20) } } } \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPlaceBlock.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPlaceBlock.kt index d16e173a21..16a7dcc247 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPlaceBlock.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPlaceBlock.kt @@ -80,11 +80,11 @@ object OpPlaceBlock : SpellAction { UseOnContext(env.world, caster as? ServerPlayer, env.otherHand, spoofedStack, blockHit) val placeContext = BlockPlaceContext(itemUseCtx) if (bstate.canBeReplaced(placeContext)) { - if (env.withdrawItem({ ItemStack.isSameItemSameTags(it, placeeStack) }, 1, false)) { + if (env.withdrawItem({ ItemStack.isSameItemSameComponents(it, placeeStack) }, 1, false)) { val res = spoofedStack.useOn(placeContext) if (res != InteractionResult.FAIL) { - env.withdrawItem({ ItemStack.isSameItemSameTags(it, placeeStack) }, 1, true) + env.withdrawItem({ ItemStack.isSameItemSameComponents(it, placeeStack) }, 1, true) env.world.playSound( caster as? ServerPlayer, diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPotionEffect.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPotionEffect.kt index 6f7dc5a05e..a3c24bd9ae 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPotionEffect.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpPotionEffect.kt @@ -4,12 +4,13 @@ import at.petrak.hexcasting.api.casting.* import at.petrak.hexcasting.api.casting.castables.SpellAction import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.iota.Iota +import net.minecraft.core.Holder import net.minecraft.world.effect.MobEffect import net.minecraft.world.effect.MobEffectInstance import net.minecraft.world.entity.LivingEntity class OpPotionEffect( - val effect: MobEffect, + val effect: Holder, val baseCost: Long, val allowPotency: Boolean, val potencyCubic: Boolean, @@ -35,13 +36,13 @@ class OpPotionEffect( potency * potency } return SpellAction.Result( - Spell(effect, target, duration, potency), + Spell(this.effect, target, duration, potency), cost.toLong(), listOf(ParticleSpray.cloud(target.position().add(0.0, target.eyeHeight / 2.0, 0.0), 1.0)) ) } - private class Spell(val effect: MobEffect, val target: LivingEntity, val duration: Double, val potency: Double) : + private class Spell(val effect: Holder, val target: LivingEntity, val duration: Double, val potency: Double) : RenderedSpell { override fun cast(env: CastingEnvironment) { if (duration > 1.0 / 20.0) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt index e5f5254afb..3dc1a09fcd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt @@ -55,9 +55,10 @@ object OpBrainsweep : SpellAction { val state = env.world.getBlockState(pos) val recman = env.world.recipeManager - val recipes = recman.getAllRecipesFor(HexRecipeStuffRegistry.BRAINSWEEP_TYPE) - val recipe = recipes.find { it.matches(state, sacrifice, env.world) } - ?: throw MishapBadBrainsweep(sacrifice, pos) + val recipe = recman.getRecipes().asSequence() + .filter { it.value().type == HexRecipeStuffRegistry.BRAINSWEEP_TYPE } + .mapNotNull { (it.value() as? BrainsweepRecipe)?.takeIf { r -> r.matches(state, sacrifice, env.world as net.minecraft.server.level.ServerLevel) } } + .firstOrNull() ?: throw MishapBadBrainsweep(sacrifice, pos) return SpellAction.Result( Spell(pos, state, sacrifice, recipe), diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpTeleport.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpTeleport.kt index e5cc06820f..39e5f1bafa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpTeleport.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpTeleport.kt @@ -18,6 +18,7 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.TicketType import net.minecraft.world.entity.Entity +import net.minecraft.tags.EnchantmentTags import net.minecraft.world.item.enchantment.EnchantmentHelper import net.minecraft.world.level.ChunkPos import net.minecraft.world.phys.Vec3 @@ -77,7 +78,7 @@ object OpTeleport : SpellAction { // having to rearrange those. Also it makes sense for LORE REASONS probably, since the caster is more // aware of items they use often. for (armorItem in teleportee.inventory.armor) { - if (EnchantmentHelper.hasBindingCurse(armorItem)) + if (EnchantmentHelper.hasTag(armorItem, EnchantmentTags.CURSE)) continue if (Math.random() < baseDropChance * 0.25) { @@ -107,8 +108,7 @@ object OpTeleport : SpellAction { val target = teleportee.position().add(delta) - // A "sticky" entity teleports itself and its riders - // This is the default behavior for teleportTo(), so we remove the riders if the teleportee *isn't* sticky + // Sticky entities teleport with riders; remove riders for non-sticky teleportee.stopRiding() if (!teleportee.type.`is`(HexTags.Entities.STICKY_TELEPORTERS)) teleportee.passengers.forEach(Entity::stopRiding) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/command/ListPerWorldPatternsCommand.java b/Common/src/main/java/at/petrak/hexcasting/common/command/ListPerWorldPatternsCommand.java index 8180d5223b..da8fb06ae9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/command/ListPerWorldPatternsCommand.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/command/ListPerWorldPatternsCommand.java @@ -7,6 +7,7 @@ import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; import at.petrak.hexcasting.common.items.storage.ItemScroll; +import at.petrak.hexcasting.common.lib.HexDataComponents; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.server.ScrungledPatternsSave; import at.petrak.hexcasting.xplat.IXplatAbstractions; @@ -103,13 +104,13 @@ private static int giveAll(CommandSourceStack source, Collection t tag.put(ItemScroll.TAG_PATTERN, pat.serializeToNBT()); var stack = new ItemStack(HexItems.SCROLL_LARGE); - stack.setTag(tag); + stack.set(HexDataComponents.STACK_DATA, tag); for (var player : targets) { var stackEntity = player.drop(stack, false); if (stackEntity != null) { stackEntity.setNoPickUpDelay(); - stackEntity.setThrower(player.getUUID()); + stackEntity.setThrower(player); } count++; @@ -137,7 +138,7 @@ private static int giveOne(CommandSourceStack source, Collection t tag.put(ItemScroll.TAG_PATTERN, pat.serializeToNBT()); var stack = new ItemStack(HexItems.SCROLL_LARGE); - stack.setTag(tag); + stack.set(HexDataComponents.STACK_DATA, tag); source.sendSuccess(() -> Component.translatable( @@ -151,7 +152,7 @@ private static int giveOne(CommandSourceStack source, Collection t var stackEntity = player.drop(stack, false); if (stackEntity != null) { stackEntity.setNoPickUpDelay(); - stackEntity.setThrower(player.getUUID()); + stackEntity.setThrower(player); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/entities/EntityWallScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/entities/EntityWallScroll.java index 03d916c8f7..4330196b5d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/entities/EntityWallScroll.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/entities/EntityWallScroll.java @@ -19,6 +19,7 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerEntity; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; @@ -30,6 +31,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; @@ -46,6 +48,7 @@ public class EntityWallScroll extends HangingEntity { public EntityWallScroll(EntityType type, Level world) { super(type, world); + this.scroll = ItemStack.EMPTY; } public EntityWallScroll(Level world, BlockPos pos, Direction dir, ItemStack scroll, boolean showStrokeOrder, @@ -72,9 +75,8 @@ public void recalculateDisplay() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(SHOWS_STROKE_ORDER, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(SHOWS_STROKE_ORDER, false); } public boolean getShowsStrokeOrder() { @@ -86,13 +88,27 @@ public void setShowsStrokeOrder(boolean b) { } @Override - public int getWidth() { - return 16 * blockSize; - } + protected AABB calculateBoundingBox(BlockPos pos, Direction direction) { + double x = pos.getX() + 0.5D; + double y = pos.getY() + 0.5D; + double z = pos.getZ() + 0.5D; - @Override - public int getHeight() { - return 16 * blockSize; + // Offset slightly away from the supporting block, same spirit as vanilla hanging entities. + double depth = 0.46875D; + x -= direction.getStepX() * depth; + z -= direction.getStepZ() * depth; + + int widthPx = 16 * this.blockSize; + int heightPx = 16 * this.blockSize; + double halfW = widthPx / 32.0D; + double halfH = heightPx / 32.0D; + + // Thin bounding box; expand along axis perpendicular to facing. + double thickness = 1.0D / 32.0D; + double dx = direction.getAxis() == Direction.Axis.Z ? halfW : thickness; + double dz = direction.getAxis() == Direction.Axis.X ? halfW : thickness; + + return new AABB(x - dx, y - halfH, z - dz, x + dx, y + halfH, z + dz); } @Override @@ -138,9 +154,9 @@ public void playPlacementSound() { } @Override - public Packet getAddEntityPacket() { + public Packet getAddEntityPacket(ServerEntity serverEntity) { return IXplatAbstractions.INSTANCE.toVanillaClientboundPacket( - new MsgNewWallScrollS2C(new ClientboundAddEntityPacket(this), + new MsgNewWallScrollS2C(new ClientboundAddEntityPacket(this, serverEntity), pos, direction, scroll, getShowsStrokeOrder(), blockSize)); } @@ -160,7 +176,7 @@ public void readSpawnData(BlockPos pos, Direction dir, ItemStack scrollItem, @Override public void addAdditionalSaveData(CompoundTag tag) { tag.putByte("direction", (byte) this.direction.ordinal()); - tag.put("scroll", HexUtils.serializeToNBT(this.scroll)); + tag.put("scroll", HexUtils.serializeToNBT(this.scroll, this.level().registryAccess())); tag.putBoolean("showsStrokeOrder", this.getShowsStrokeOrder()); tag.putInt("blockSize", this.blockSize); super.addAdditionalSaveData(tag); @@ -169,7 +185,7 @@ public void addAdditionalSaveData(CompoundTag tag) { @Override public void readAdditionalSaveData(CompoundTag tag) { this.direction = Direction.values()[tag.getByte("direction")]; - this.scroll = ItemStack.of(tag.getCompound("scroll")); + this.scroll = ItemStack.parseOptional(this.level().registryAccess(), tag.getCompound("scroll")); this.blockSize = tag.getInt("blockSize"); this.setDirection(this.direction); @@ -187,14 +203,12 @@ public void moveTo(double pX, double pY, double pZ, float pYaw, float pPitch) { } @Override - public void lerpTo(double pX, double pY, double pZ, float pYaw, float pPitch, int pPosRotationIncrements, - boolean pTeleport) { + public void lerpTo(double pX, double pY, double pZ, float pYaw, float pPitch, int pPosRotationIncrements) { BlockPos blockpos = this.pos.offset((int) (pX - this.getX()), (int) (pY - this.getY()), (int) (pZ - this.getZ())); this.setPos(blockpos.getX(), blockpos.getY(), blockpos.getZ()); } @Nullable - @Override public ItemStack getPickResult() { return this.scroll.copy(); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java b/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java index 0ff996b907..aee1c66f70 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java @@ -96,50 +96,21 @@ public FrozenPigment getColorizer(Player player) { return IXplatAbstractions.INSTANCE.getPigment(player); } - ArmorMaterial ARMOR_MATERIAL = new ArmorMaterial() { - - @Override - public int getDurabilityForType(ArmorItem.Type type) { - return 0; - } - - @Override - public int getDefenseForType(ArmorItem.Type type) { - return 0; - } - - @Override - public int getEnchantmentValue() { - return 0; - } - - @NotNull - @Override - public SoundEvent getEquipSound() { - return SoundEvents.ARMOR_EQUIP_LEATHER; - } - - @NotNull - @Override - public Ingredient getRepairIngredient() { - return Ingredient.EMPTY; - } - - @Override - public String getName() { - return "robes"; - } - - @Override - public float getToughness() { - return 0; - } - - @Override - public float getKnockbackResistance() { - return 0; - } - }; + ArmorMaterial ARMOR_MATERIAL = new ArmorMaterial( + java.util.Map.of( + ArmorItem.Type.BOOTS, 0, + ArmorItem.Type.LEGGINGS, 0, + ArmorItem.Type.CHESTPLATE, 0, + ArmorItem.Type.HELMET, 0, + ArmorItem.Type.BODY, 0 + ), + 0, + SoundEvents.ARMOR_EQUIP_LEATHER, + () -> Ingredient.EMPTY, + java.util.List.of(new ArmorMaterial.Layer(HexAPI.modLoc("robes"))), + 0f, + 0f + ); @Override public ArmorMaterial robesMaterial() { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemJewelerHammer.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemJewelerHammer.java index d5b059f5f7..713c7e3c73 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemJewelerHammer.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemJewelerHammer.java @@ -10,8 +10,8 @@ import net.minecraft.world.level.block.state.BlockState; public class ItemJewelerHammer extends PickaxeItem { - public ItemJewelerHammer(Tier tier, int damageMod, float attackSpeedMod, Properties props) { - super(tier, damageMod, attackSpeedMod, props); + public ItemJewelerHammer(Tier tier, Properties props) { + super(tier, props); } public static boolean shouldFailToBreak(Player player, BlockState state, BlockPos pos) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java index 4b77873f29..3caa664ac3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java @@ -4,32 +4,35 @@ import at.petrak.hexcasting.common.lib.HexAttributes; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import net.minecraft.core.BlockSource; +import net.minecraft.core.Holder; +import net.minecraft.core.dispenser.BlockSource; import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; //import net.minecraft.world.item.Wearable; import net.minecraft.world.level.block.DispenserBlock; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.UUID; +import static at.petrak.hexcasting.api.HexAPI.modLoc; public class ItemLens extends Item implements HexBaubleItem { // Wearable, // The 0.1 is *additive* public static final AttributeModifier GRID_ZOOM = new AttributeModifier( - UUID.fromString("59d739b8-d419-45f7-a4ea-0efee0e3adf5"), - "Scrying Lens Zoom", 0.33, AttributeModifier.Operation.MULTIPLY_BASE); + modLoc("scrying_lens_zoom"), + 0.33, AttributeModifier.Operation.ADD_MULTIPLIED_BASE); public static final AttributeModifier SCRY_SIGHT = new AttributeModifier( - UUID.fromString("e2e6e5d4-f978-4c11-8fdc-82a5af83385c"), - "Scrying Lens Sight", 1.0, AttributeModifier.Operation.ADDITION); + modLoc("scrying_lens_sight"), + 1.0, AttributeModifier.Operation.ADD_VALUE); public ItemLens(Properties pProperties) { super(pProperties); @@ -43,13 +46,21 @@ ItemStack execute(@NotNull BlockSource world, @NotNull ItemStack stack) { } @Override - public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { - var out = HashMultimap.create(super.getDefaultAttributeModifiers(slot)); - if (slot == EquipmentSlot.HEAD || slot == EquipmentSlot.MAINHAND || slot == EquipmentSlot.OFFHAND) { - out.put(HexAttributes.GRID_ZOOM, GRID_ZOOM); - out.put(HexAttributes.SCRY_SIGHT, SCRY_SIGHT); + public ItemAttributeModifiers getDefaultAttributeModifiers() { + var parent = super.getDefaultAttributeModifiers(); + var builder = ItemAttributeModifiers.builder(); + for (var e : parent.modifiers()) { + builder.add(e.attribute(), e.modifier(), e.slot()); } - return out; + var gridZoomHolder = Holder.direct(HexAttributes.GRID_ZOOM); + var scrySightHolder = Holder.direct(HexAttributes.SCRY_SIGHT); + builder.add(gridZoomHolder, GRID_ZOOM, EquipmentSlotGroup.HEAD); + builder.add(scrySightHolder, SCRY_SIGHT, EquipmentSlotGroup.HEAD); + builder.add(gridZoomHolder, GRID_ZOOM, EquipmentSlotGroup.MAINHAND); + builder.add(scrySightHolder, SCRY_SIGHT, EquipmentSlotGroup.MAINHAND); + builder.add(gridZoomHolder, GRID_ZOOM, EquipmentSlotGroup.OFFHAND); + builder.add(scrySightHolder, SCRY_SIGHT, EquipmentSlotGroup.OFFHAND); + return builder.build(); } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLoreFragment.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLoreFragment.java index 3d2f347bee..d6e4051a7c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLoreFragment.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLoreFragment.java @@ -1,7 +1,7 @@ package at.petrak.hexcasting.common.items; import at.petrak.hexcasting.common.lib.HexSounds; -import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -49,11 +49,11 @@ public InteractionResultHolder use(Level level, Player player, Intera return InteractionResultHolder.success(handStack); } - Advancement unfoundLore = null; + AdvancementHolder unfoundLore = null; var shuffled = new ArrayList<>(NAMES); Collections.shuffle(shuffled); for (var advID : shuffled) { - var adv = splayer.server.getAdvancements().getAdvancement(advID); + var adv = splayer.server.getAdvancements().get(advID); if (adv == null) { continue; // uh oh } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java index 558f716dc5..eb0324b3f8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java @@ -18,7 +18,7 @@ public class ItemStaff extends Item { // 0 = normal. 1 = old. 2 = cherry preview - public static final ResourceLocation FUNNY_LEVEL_PREDICATE = new ResourceLocation(HexAPI.MOD_ID, "funny_level"); + public static final ResourceLocation FUNNY_LEVEL_PREDICATE = ResourceLocation.fromNamespaceAndPath(HexAPI.MOD_ID, "funny_level"); public ItemStaff(Properties pProperties) { super(pProperties); @@ -26,7 +26,7 @@ public ItemStaff(Properties pProperties) { @Override public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { - if (player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0){ + if (player.getAttributeValue(HexAttributes.getHolder(player, HexAttributes.FEEBLE_MIND_KEY)) > 0){ return InteractionResultHolder.fail(player.getItemInHand(hand)); } if (player.isShiftKeyDown()) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index 3ec73cbdc6..9ddef43531 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.items.armor; import at.petrak.hexcasting.api.HexAPI; +import net.minecraft.core.Holder; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorItem; @@ -13,7 +14,7 @@ public class ItemRobes extends ArmorItem { public final ArmorItem.Type type; public ItemRobes(ArmorItem.Type type, Properties properties) { - super(HexAPI.instance().robesMaterial(), type, properties); + super(Holder.direct(HexAPI.instance().robesMaterial()), type, properties); this.type = type; } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java index 44568c1f8e..029eb74194 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemAncientCypher.java @@ -6,9 +6,9 @@ import net.minecraft.nbt.Tag; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -39,10 +39,10 @@ public Component getName(ItemStack pStack) { } @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + public void appendHoverText(ItemStack pStack, Item.TooltipContext pTooltipContext, List pTooltipComponents, TooltipFlag pIsAdvanced) { // display media fullness as usual - super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + super.appendHoverText(pStack, pTooltipContext, pTooltipComponents, pIsAdvanced); // also show contained spell var patternsTag = NBTHelper.getList(pStack, TAG_PATTERNS, Tag.TAG_COMPOUND); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java index 586f8b2c02..92091a6633 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java @@ -9,11 +9,14 @@ import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.lib.HexSounds; import net.minecraft.ChatFormatting; -import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementNode; +import net.minecraft.advancements.AdvancementTree; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextColor; +import net.minecraft.core.component.DataComponents; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; @@ -70,7 +73,7 @@ public static boolean isDebug(ItemStack stack) { } public static boolean isDebug(ItemStack stack, String flag) { - if (!stack.is(HexItems.CREATIVE_UNLOCKER) || !stack.hasCustomHoverName()) { + if (!stack.is(HexItems.CREATIVE_UNLOCKER) || stack.get(DataComponents.CUSTOM_NAME) == null) { return false; } var keywords = Arrays.asList(stack.getHoverName().getString().toLowerCase(Locale.ROOT).split(" ")); @@ -146,7 +149,6 @@ public static void addToLongArray(ItemStack stack, String tag, long n) { @Override public long withdrawMedia(ItemStack stack, long cost, boolean simulate) { - // In case it's withdrawn through other means if (!simulate && isDebug(stack, DISPLAY_MEDIA)) { addToLongArray(stack, TAG_EXTRACTIONS, cost); } @@ -156,7 +158,6 @@ public long withdrawMedia(ItemStack stack, long cost, boolean simulate) { @Override public long insertMedia(ItemStack stack, long amount, boolean simulate) { - // In case it's inserted through other means if (!simulate && isDebug(stack, DISPLAY_MEDIA)) { addToLongArray(stack, TAG_INSERTIONS, amount); } @@ -214,18 +215,21 @@ public InteractionResult useOn(UseOnContext context) { @Override public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity consumer) { if (level instanceof ServerLevel slevel && consumer instanceof ServerPlayer player) { + var advManager = slevel.getServer().getAdvancements(); + var tree = advManager.tree(); var names = new ArrayList<>(ItemLoreFragment.NAMES); names.add(0, modLoc("root")); for (var name : names) { - var rootAdv = slevel.getServer().getAdvancements().getAdvancement(name); - if (rootAdv != null) { - var children = new ArrayList(); - children.add(rootAdv); - addChildren(rootAdv, children); + var rootHolder = advManager.get(name); + if (rootHolder != null) { + var children = new ArrayList(); + children.add(rootHolder); + addChildren(tree, rootHolder, children); var adman = player.getAdvancements(); for (var kid : children) { + if (kid == null) continue; var progress = adman.getOrStartProgress(kid); if (!progress.isDone()) { for (String crit : progress.getRemainingCriteria()) { @@ -252,9 +256,9 @@ private static MutableComponent rainbow(MutableComponent component, int shift, L } @Override - public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, + public void appendHoverText(ItemStack stack, Item.TooltipContext pTooltipContext, List tooltipComponents, TooltipFlag isAdvanced) { - Component emphasized = infiniteMedia(level); + Component emphasized = infiniteMedia(null); // TooltipContext has no level in 1.21; rainbow falls back to white MutableComponent modName = Component.translatable("item.hexcasting.creative_unlocker.mod_name").withStyle( (s) -> s.withColor(ItemMediaHolder.HEX_COLOR)); @@ -264,10 +268,13 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List out) { - for (Advancement kiddo : root.getChildren()) { - out.add(kiddo); - addChildren(kiddo, out); + private static void addChildren(AdvancementTree tree, AdvancementHolder root, List out) { + AdvancementNode node = tree.get(root); + if (node != null) { + for (AdvancementNode kiddo : node.children()) { + out.add(kiddo.holder()); + addChildren(tree, kiddo.holder(), out); + } } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemMediaHolder.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemMediaHolder.java index 5bc736a2fa..9fa4d9f75a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemMediaHolder.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemMediaHolder.java @@ -7,6 +7,7 @@ import at.petrak.hexcasting.api.utils.NBTHelper; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextColor; +import net.minecraft.world.item.Item; import net.minecraft.util.Mth; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -87,12 +88,7 @@ public int getBarWidth(ItemStack pStack) { } @Override - public boolean canBeDepleted() { - return false; - } - - @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + public void appendHoverText(ItemStack pStack, Item.TooltipContext pTooltipContext, List pTooltipComponents, TooltipFlag pIsAdvanced) { var maxMedia = getMaxMedia(pStack); if (maxMedia > 0) { @@ -114,6 +110,6 @@ public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List use(Level world, Player player, Intera if (broken) { stack.shrink(1); - player.broadcastBreakEvent(usedHand); return InteractionResultHolder.consume(stack); } else { return InteractionResultHolder.success(stack); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/pigment/ItemUUIDPigment.java b/Common/src/main/java/at/petrak/hexcasting/common/items/pigment/ItemUUIDPigment.java index c895177f47..7dad934967 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/pigment/ItemUUIDPigment.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/pigment/ItemUUIDPigment.java @@ -24,13 +24,44 @@ public ColorProvider provideColor(ItemStack stack, UUID owner) { return new MyColorProvider(owner); } + /** Get PaucalAPI - supports instance(), getInstance(), INSTANCE, or get() depending on Paucal version */ + private static Object getPaucalAPI() { + for (var name : new String[]{"instance", "getInstance", "get"}) { + try { + var method = PaucalAPI.class.getMethod(name); + return method.invoke(null); + } catch (NoSuchMethodException ignored) { + } catch (Exception e) { + return null; + } + } + try { + return PaucalAPI.class.getField("INSTANCE").get(null); + } catch (Exception e) { + return null; + } + } + protected static class MyColorProvider extends ColorProvider { private final int[] colors; MyColorProvider(UUID owner) { - var contributor = PaucalAPI.instance().getContributor(owner); + Object contributor = null; + var api = getPaucalAPI(); + if (api != null) { + try { + var m = api.getClass().getMethod("getContributor", UUID.class); + contributor = m.invoke(api, owner); + } catch (Exception ignored) {} + } if (contributor != null) { - var colorList = contributor.otherVals().getAsJsonArray("hexcasting:colorizer"); + com.google.gson.JsonArray colorList = null; + try { + var otherVals = contributor.getClass().getMethod("otherVals").invoke(contributor); + if (otherVals instanceof com.google.gson.JsonObject jo) { + colorList = jo.getAsJsonArray("hexcasting:colorizer"); + } + } catch (Exception ignored) {} if (colorList != null) { var colors = new int[colorList.size()]; var ok = true; diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemAbacus.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemAbacus.java index ad8527581f..ef121281b9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemAbacus.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemAbacus.java @@ -53,7 +53,7 @@ public InteractionResultHolder use(Level world, Player player, Intera var stack = player.getItemInHand(hand); if (player.isShiftKeyDown()) { double oldNum = NBTHelper.getDouble(stack, TAG_VALUE); - stack.removeTagKey(TAG_VALUE); + NBTHelper.removeTagKey(stack, TAG_VALUE); player.playSound(HexSounds.ABACUS_SHAKE, 1f, 1f); @@ -70,8 +70,9 @@ public InteractionResultHolder use(Level world, Player player, Intera } @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + public void appendHoverText(ItemStack pStack, Item.TooltipContext pTooltipContext, List pTooltipComponents, TooltipFlag pIsAdvanced) { IotaHolderItem.appendHoverText(this, pStack, pTooltipComponents, pIsAdvanced); + super.appendHoverText(pStack, pTooltipContext, pTooltipComponents, pIsAdvanced); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemFocus.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemFocus.java index 8d08c9923f..5ecea25208 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemFocus.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemFocus.java @@ -11,7 +11,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -56,15 +55,15 @@ public boolean canWrite(ItemStack stack, Iota datum) { @Override public void writeDatum(ItemStack stack, Iota datum) { if (datum == null) { - stack.removeTagKey(TAG_DATA); - stack.removeTagKey(TAG_SEALED); + NBTHelper.remove(stack, TAG_DATA); + NBTHelper.remove(stack, TAG_SEALED); } else if (!isSealed(stack)) { NBTHelper.put(stack, TAG_DATA, IotaType.serialize(datum)); } } @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + public void appendHoverText(ItemStack pStack, Item.TooltipContext pTooltipContext, List pTooltipComponents, TooltipFlag pIsAdvanced) { IotaHolderItem.appendHoverText(this, pStack, pTooltipComponents, pIsAdvanced); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java index 09a8f44b7c..5d44425b8b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java @@ -10,7 +10,7 @@ import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; import at.petrak.hexcasting.common.misc.PatternTooltip; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; -import at.petrak.hexcasting.interop.inline.InlinePatternData; +import at.petrak.hexcasting.common.misc.PatternDisplayHelper; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -60,7 +60,6 @@ public ItemScroll(Properties pProperties, int blockSize) { this.blockSize = blockSize; } - // this produces a scroll that will load the correct pattern for your world once it ticks public static ItemStack withPerWorldPattern(ItemStack stack, String op_id) { Item item = stack.getItem(); if (item instanceof ItemScroll) @@ -76,7 +75,6 @@ CompoundTag readIotaTag(ItemStack stack) { if (pattern == null) { return null; } - // We store only the data part of the iota; pretend the rest of it's there var out = new CompoundTag(); out.putString(HexIotaTypes.KEY_TYPE, "hexcasting:pattern"); out.put(HexIotaTypes.KEY_DATA, pattern); @@ -119,12 +117,6 @@ public InteractionResult useOn(UseOnContext ctx) { scrollStack.setCount(1); var scrollEntity = new EntityWallScroll(level, posInFront, direction, scrollStack, false, this.blockSize); - // i guess - var stackTag = itemstack.getTag(); - if (stackTag != null) { - EntityType.updateCustomEntityTag(level, player, scrollEntity, stackTag); - } - if (scrollEntity.survives()) { if (!level.isClientSide) { scrollEntity.playPlacementSound(); @@ -156,7 +148,7 @@ public Component getName(ItemStack pStack) { var patternLabel = Component.literal(""); if (compound != null) { var pattern = HexPattern.fromNBT(compound); - patternLabel = Component.literal(": ").append(new InlinePatternData(pattern).asText(false)); + patternLabel = Component.literal(": ").append(PatternDisplayHelper.getDisplayComponent(pattern, false)); } return Component.translatable(descID).append(patternLabel); } else { @@ -166,23 +158,18 @@ public Component getName(ItemStack pStack) { @Override public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pSlotId, boolean pIsSelected) { - // the needs_purchase tag is used so you can't see the pattern on scrolls sold by a wandering trader - // once you put the scroll into your inventory, this removes the tag to reveal the pattern if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { NBTHelper.remove(pStack, TAG_NEEDS_PURCHASE); } - // if op_id is set but there's no stored pattern, attempt to load the pattern on inv tick if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN) && pEntity.getServer() != null) { var opID = ResourceLocation.tryParse(NBTHelper.getString(pStack, TAG_OP_ID)); if (opID == null) { - // if the provided op_id is invalid, remove it so we don't keep trying every tick NBTHelper.remove(pStack, TAG_OP_ID); return; } var patternKey = ResourceKey.create(IXplatAbstractions.INSTANCE.getActionRegistry().key(), opID); var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(patternKey, pEntity.getServer().overworld()); if (pat == null) { - // if pat is null, the per-world order hasn't been registered; remove the op_id and warn the player NBTHelper.putString(pStack, TAG_RECALC_WARNING, NBTHelper.getString(pStack, TAG_OP_ID)); NBTHelper.remove(pStack, TAG_OP_ID); return; @@ -192,7 +179,7 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS } @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + public void appendHoverText(ItemStack pStack, Item.TooltipContext pTooltipContext, List pTooltipComponents, TooltipFlag pIsAdvanced) { if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { var needsPurchase = Component.translatable("hexcasting.tooltip.scroll.needs_purchase"); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSlate.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSlate.java index 98227d1eab..75390d9d90 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSlate.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSlate.java @@ -10,8 +10,8 @@ import at.petrak.hexcasting.client.gui.PatternTooltipComponent; import at.petrak.hexcasting.common.blocks.circles.BlockEntitySlate; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; +import at.petrak.hexcasting.common.misc.PatternDisplayHelper; import at.petrak.hexcasting.common.misc.PatternTooltip; -import at.petrak.hexcasting.interop.inline.InlinePatternData; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -40,7 +40,7 @@ public ItemSlate(Block pBlock, Properties pProperties) { public Component getName(ItemStack pStack) { var key = "block." + HexAPI.MOD_ID + ".slate." + (hasPattern(pStack) ? "written" : "blank"); Component patternText = getPattern(pStack) - .map(pat -> Component.literal(": ").append(new InlinePatternData(pat).asText(false))) + .map(pat -> Component.literal(": ").append(PatternDisplayHelper.getDisplayComponent(pat, false))) .orElse(Component.literal("")); return Component.translatable(key).append(patternText); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSpellbook.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSpellbook.java index b7521f7619..6e4b264ff4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSpellbook.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemSpellbook.java @@ -6,11 +6,13 @@ import at.petrak.hexcasting.api.item.VariantItem; import at.petrak.hexcasting.api.utils.NBTHelper; import net.minecraft.ChatFormatting; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; +import net.minecraft.core.HolderLookup; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -24,19 +26,13 @@ public class ItemSpellbook extends Item implements IotaHolderItem, VariantItem { public static String TAG_SELECTED_PAGE = "page_idx"; - // this is a CompoundTag of string numerical keys to SpellData - // it is 1-indexed, so that 0/0 can be the special case of "it is empty" + // 1-indexed; 0 = empty public static String TAG_PAGES = "pages"; - // this stores the names of pages, to be restored when you scroll - // it is 1-indexed, and the 0-case for TAG_PAGES will be treated as 1 public static String TAG_PAGE_NAMES = "page_names"; - // this stores the sealed status of each page, to be restored when you scroll - // it is 1-indexed, and the 0-case for TAG_PAGES will be treated as 1 public static String TAG_SEALED = "sealed_pages"; - // this stores which variant of the spellbook should be rendered public static final String TAG_VARIANT = "variant"; public static final int MAX_PAGES = 64; @@ -46,7 +42,7 @@ public ItemSpellbook(Properties properties) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, + public void appendHoverText(ItemStack stack, Item.TooltipContext tooltipContext, List tooltip, TooltipFlag isAdvanced) { boolean sealed = isSealed(stack); boolean empty = false; @@ -92,7 +88,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List pTooltipComponents, TooltipFlag pIsAdvanced) { IotaHolderItem.appendHoverText(this, pStack, pTooltipComponents, pIsAdvanced); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java index 097c305ad9..d7a54f99ff 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java @@ -2,7 +2,11 @@ import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.api.casting.eval.env.PlayerBasedCastEnv; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.RangedAttribute; @@ -27,6 +31,14 @@ public static void register(BiConsumer r) { private static final String MOD_ID = HexAPI.MOD_ID; + // 1.21+ ResourceKeys for Holder lookup + public static final ResourceKey GRID_ZOOM_KEY = ResourceKey.create(Registries.ATTRIBUTE, modLoc("grid_zoom")); + public static final ResourceKey SCRY_SIGHT_KEY = ResourceKey.create(Registries.ATTRIBUTE, modLoc("scry_sight")); + public static final ResourceKey FEEBLE_MIND_KEY = ResourceKey.create(Registries.ATTRIBUTE, modLoc("feeble_mind")); + public static final ResourceKey MEDIA_CONSUMPTION_MODIFIER_KEY = ResourceKey.create(Registries.ATTRIBUTE, modLoc("media_consumption")); + public static final ResourceKey AMBIT_RADIUS_KEY = ResourceKey.create(Registries.ATTRIBUTE, modLoc("ambit_radius")); + public static final ResourceKey SENTINEL_RADIUS_KEY = ResourceKey.create(Registries.ATTRIBUTE, modLoc("sentinel_radius")); + public static final Attribute GRID_ZOOM = make("grid_zoom", new RangedAttribute( MOD_ID + ".attributes.grid_zoom", 1.0, 0.5, 4.0)).setSyncable(true); @@ -36,11 +48,9 @@ public static void register(BiConsumer r) { public static final Attribute SCRY_SIGHT = make("scry_sight", new RangedAttribute( MOD_ID + ".attributes.scry_sight", 0.0, 0.0, 1.0)).setSyncable(true); - //whether the player is allowed to use staffcasting and scrying lenses public static final Attribute FEEBLE_MIND = make("feeble_mind", new RangedAttribute( MOD_ID + ".attributes.feeble_mind", 0.0, 0.0, 1.0).setSyncable(true)); - //a multiplier to adjust media consumption across the board public static final Attribute MEDIA_CONSUMPTION_MODIFIER = make("media_consumption", new RangedAttribute( MOD_ID + ".attributes.media_consumption", 1.0, 0.0, Double.MAX_VALUE).setSyncable(true)); @@ -59,4 +69,13 @@ private static T make(String id, T attr) { } return attr; } + + /** 1.21+ Helper to get Holder for getAttributeValue */ + public static net.minecraft.core.Holder getHolder(Registry registry, ResourceKey key) { + return registry.getHolderOrThrow(key); + } + + public static net.minecraft.core.Holder getHolder(Entity entity, ResourceKey key) { + return entity.registryAccess().registryOrThrow(Registries.ATTRIBUTE).getHolderOrThrow(key); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlockEntities.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlockEntities.java index 6e22920668..e29584155a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlockEntities.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlockEntities.java @@ -80,7 +80,7 @@ public static BlockEntityType typeForQuenchedAllay(Blo private static BlockEntityType register(String id, BiFunction func, Block... blocks) { var ret = IXplatAbstractions.INSTANCE.createBlockEntityType(func, blocks); - var old = BLOCK_ENTITIES.put(new ResourceLocation(HexAPI.MOD_ID, id), ret); + var old = BLOCK_ENTITIES.put(ResourceLocation.fromNamespaceAndPath(HexAPI.MOD_ID, id), ret); if (old != null) { throw new IllegalArgumentException("Duplicate id " + id); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 6608b324b6..f2300cbe68 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -65,7 +65,7 @@ public static void registerBlockCreativeTab(Consumer r, CreativeModeTab t private static BlockBehaviour.Properties slateish() { return BlockBehaviour.Properties - .copy(Blocks.DEEPSLATE_TILES) + .ofFullCopy(Blocks.DEEPSLATE_TILES) .strength(4f, 4f); } @@ -85,7 +85,7 @@ private static BlockBehaviour.Properties akashicWoodyHard() { private static BlockBehaviour.Properties woodyHard(MapColor color) { return BlockBehaviour.Properties - .copy(Blocks.OAK_LOG) + .ofFullCopy(Blocks.OAK_LOG) .mapColor(color) .sound(SoundType.WOOD) .strength(3f, 4f); @@ -97,7 +97,7 @@ private static BlockBehaviour.Properties edifiedWoody() { private static BlockBehaviour.Properties woody(MapColor color) { return BlockBehaviour.Properties - .copy(Blocks.OAK_LOG) + .ofFullCopy(Blocks.OAK_LOG) .mapColor(color) .sound(SoundType.WOOD) .strength(2f); @@ -105,7 +105,7 @@ private static BlockBehaviour.Properties woody(MapColor color) { private static BlockBehaviour.Properties leaves(MapColor color) { return BlockBehaviour.Properties - .copy(Blocks.OAK_LEAVES) + .ofFullCopy(Blocks.OAK_LEAVES) .strength(0.2F) .randomTicks() .sound(SoundType.GRASS) @@ -118,7 +118,7 @@ private static BlockBehaviour.Properties leaves(MapColor color) { // we have to make it emit light because otherwise it occludes itself and is always dark private static BlockBehaviour.Properties quenched() { return BlockBehaviour.Properties - .copy(Blocks.AMETHYST_BLOCK) + .ofFullCopy(Blocks.AMETHYST_BLOCK) .lightLevel($ -> 4) .noOcclusion(); } @@ -213,17 +213,18 @@ private static BlockBehaviour.Properties quenched() { public static final Block SLATE_BRICKS = blockItem("slate_bricks", new Block(slateish().strength(2f, 4f))); public static final Block SLATE_BRICKS_SMALL = blockItem("slate_bricks_small", new Block(slateish().strength(2f, 4f))); public static final RotatedPillarBlock SLATE_PILLAR = blockItem("slate_pillar", new RotatedPillarBlock(slateish().strength(2f, 4f))); - public static final SandBlock AMETHYST_DUST_BLOCK = blockItem("amethyst_dust_block", - new SandBlock(0xff_b38ef3, BlockBehaviour.Properties.copy(Blocks.SAND).mapColor(MapColor.COLOR_PURPLE) + public static final ColoredFallingBlock AMETHYST_DUST_BLOCK = blockItem("amethyst_dust_block", + new ColoredFallingBlock(new net.minecraft.util.ColorRGBA(0xff_b38ef3), + BlockBehaviour.Properties.ofFullCopy(Blocks.SAND).mapColor(MapColor.COLOR_PURPLE) .strength(0.5f).sound(SoundType.SAND))); public static final AmethystBlock AMETHYST_TILES = blockItem("amethyst_tiles", - new AmethystBlock(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); + new AmethystBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK))); public static final AmethystBlock AMETHYST_BRICKS = blockItem("amethyst_bricks", - new AmethystBlock(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); + new AmethystBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK))); public static final AmethystBlock AMETHYST_BRICKS_SMALL = blockItem("amethyst_bricks_small", - new AmethystBlock(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); + new AmethystBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK))); public static final BlockAmethystDirectional AMETHYST_PILLAR = blockItem("amethyst_pillar", - new BlockAmethystDirectional(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); + new BlockAmethystDirectional(BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK))); public static final Block SLATE_AMETHYST_TILES = blockItem("slate_amethyst_tiles", new Block(slateish().strength(2f, 4f))); public static final Block SLATE_AMETHYST_BRICKS = blockItem("slate_amethyst_bricks", new Block(slateish().strength(2f, 4f))); public static final Block SLATE_AMETHYST_BRICKS_SMALL = blockItem("slate_amethyst_bricks_small", new Block(slateish().strength(2f, 4f))); @@ -285,8 +286,7 @@ private static BlockBehaviour.Properties quenched() { public static final ButtonBlock EDIFIED_BUTTON = blockItem("edified_button", new BlockHexWoodButton(edifiedWoody().noOcclusion().noCollission())); public static final PressurePlateBlock EDIFIED_PRESSURE_PLATE = blockItem("edified_pressure_plate", - new BlockHexPressurePlate(PressurePlateBlock.Sensitivity.EVERYTHING, - edifiedWoody().noOcclusion().noCollission())); + new BlockHexPressurePlate(edifiedWoody().noOcclusion().noCollission())); public static final BlockAkashicLeaves AMETHYST_EDIFIED_LEAVES = blockItem("amethyst_edified_leaves", new BlockAkashicLeaves(leaves(MapColor.COLOR_PURPLE))); public static final BlockAkashicLeaves AVENTURINE_EDIFIED_LEAVES = blockItem("aventurine_edified_leaves", diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexConfiguredFeatures.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexConfiguredFeatures.java index 05f06de4e8..391b9cac1b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexConfiguredFeatures.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexConfiguredFeatures.java @@ -12,6 +12,6 @@ public class HexConfiguredFeatures { public static final ResourceKey> CITRINE_EDIFIED_TREE = createKey("citrine_edified_tree"); private static ResourceKey> createKey(String name) { - return ResourceKey.create(Registries.CONFIGURED_FEATURE, new ResourceLocation(HexAPI.MOD_ID, name)); + return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(HexAPI.MOD_ID, name)); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java index d0451ec184..6bd0f900fc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java @@ -1,7 +1,7 @@ package at.petrak.hexcasting.common.lib; import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.world.damagesource.DamageScaling; import net.minecraft.world.damagesource.DamageType; @@ -11,7 +11,7 @@ public class HexDamageTypes { public static final ResourceKey OVERCAST = ResourceKey.create(Registries.DAMAGE_TYPE, modLoc("overcast")); - public static void bootstrap(BootstapContext ctx) { + public static void bootstrap(BootstrapContext ctx) { ctx.register(OVERCAST, new DamageType( "hexcasting.overcast", DamageScaling.WHEN_CAUSED_BY_LIVING_NON_PLAYER, diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDataComponents.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDataComponents.java new file mode 100644 index 0000000000..460709ba77 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDataComponents.java @@ -0,0 +1,25 @@ +package at.petrak.hexcasting.common.lib; + +import net.minecraft.core.component.DataComponentType; +import net.minecraft.nbt.CompoundTag; + +/** + * Data component types for 1.21+ item/entity storage. + * Replaces NBT-based storage for Iota and related data. + *

+ * The platform (NeoForge/Fabric) must register these to + * {@code Registries.DATA_COMPONENT_TYPE} during mod init, e.g.: + * {@code event.register(Registries.DATA_COMPONENT_TYPE, HexAPI.modLoc("stack_data"), () -> HexDataComponents.STACK_DATA);} + */ +public final class HexDataComponents { + /** + * Holds a {@link CompoundTag} for item stack custom data (Iota, sealed, variant, etc.). + * Used so that {@link at.petrak.hexcasting.api.utils.NBTHelper} can read/write + * via this component on 1.21+ instead of the removed ItemStack tag. + */ + public static final DataComponentType STACK_DATA = DataComponentType.builder() + .persistent(CompoundTag.CODEC) + .build(); + + private HexDataComponents() {} +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexFeatureConfigs.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexFeatureConfigs.java index 52be4c646e..cbd856a66d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexFeatureConfigs.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexFeatureConfigs.java @@ -18,7 +18,6 @@ public class HexFeatureConfigs { public static void dumpConfigs() { - // Used to generate the tree data json files // Call this after the game is properly bootstrapped and copy the output logs to data/hexcasting/worldgen/configured_feature/${name}.json // This should be done in DataGen, but I was unable to make that function. - dashkal16 HexAPI.LOGGER.info(TreeConfiguration.CODEC.encodeStart(JsonOps.INSTANCE, AMETHYST_EDIFIED_TREE_CONFIG)); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 3cd0e47c32..636e442a71 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -45,6 +45,7 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod private static final Map ITEMS = new LinkedHashMap<>(); // preserve insertion order private static final Map> ITEM_TABS = new LinkedHashMap<>(); + private static final List GENERATED_SCROLL_ENTRIES = new ArrayList<>(); public static final Item AMETHYST_DUST = make("amethyst_dust", new Item(props())); @@ -83,7 +84,7 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod public static final ItemArtifact ARTIFACT = make("artifact", new ItemArtifact(unstackable().rarity(Rarity.RARE))); public static final ItemJewelerHammer JEWELER_HAMMER = make("jeweler_hammer", - new ItemJewelerHammer(Tiers.IRON, 0, -2.8F, props().stacksTo(1).defaultDurability(Tiers.DIAMOND.getUses()))); + new ItemJewelerHammer(Tiers.IRON, props().stacksTo(1).durability(Tiers.DIAMOND.getUses()))); public static final ItemScroll SCROLL_SMOL = make("scroll_small", new ItemScroll(props(), 1)); public static final ItemScroll SCROLL_MEDIUM = make("scroll_medium", new ItemScroll(props(), 2)); @@ -139,7 +140,7 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod // BUFF SANDVICH public static final Item SUBMARINE_SANDWICH = make("sub_sandwich", - new Item(props().food(new FoodProperties.Builder().nutrition(14).saturationMod(1.2f).build()))); + new Item(props().food(new FoodProperties.Builder().nutrition(14).saturationModifier(1.2f).build()))); public static final ItemLoreFragment LORE_FRAGMENT = make("lore_fragment", new ItemLoreFragment(unstackable() @@ -148,7 +149,7 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod public static final ItemCreativeUnlocker CREATIVE_UNLOCKER = make("creative_unlocker", new ItemCreativeUnlocker(unstackable() .rarity(Rarity.EPIC) - .food(new FoodProperties.Builder().nutrition(20).saturationMod(1f).alwaysEat().build()))); + .food(new FoodProperties.Builder().nutrition(20).saturationModifier(1f).alwaysEdible().build()))); // @@ -161,6 +162,10 @@ public static Item.Properties unstackable() { } private static void generateScrollEntries() { + var scrollTabEntries = ITEM_TABS.computeIfAbsent(HexCreativeTabs.SCROLLS, t -> new ArrayList<>()); + scrollTabEntries.removeAll(GENERATED_SCROLL_ENTRIES); + GENERATED_SCROLL_ENTRIES.clear(); + var keyList = new ArrayList>(); Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); for (var key : regi.registryKeySet()) @@ -168,10 +173,13 @@ private static void generateScrollEntries() { keyList.add(key); keyList.sort( (a, b) -> a.location().compareTo(b.location()) ); for (var key : keyList) { - addToTab(() -> ItemScroll.withPerWorldPattern( + var memoised = Suppliers.memoize(() -> ItemScroll.withPerWorldPattern( new ItemStack(HexItems.SCROLL_LARGE), key.location().toString() - ),HexCreativeTabs.SCROLLS); + )); + var entry = new TabEntry.StackEntry(memoised); + scrollTabEntries.add(entry); + GENERATED_SCROLL_ENTRIES.add(entry); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java index 409f5c979c..4f9d2b57ba 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexLootFunctions.java @@ -22,11 +22,11 @@ public static void registerSerializers(BiConsumer LOOT_FUNCS = new LinkedHashMap<>(); public static final LootItemFunctionType PATTERN_SCROLL = register("pattern_scroll", - new LootItemFunctionType(new AddPerWorldPatternToScrollFunc.Serializer())); + new LootItemFunctionType(AddPerWorldPatternToScrollFunc.CODEC)); public static final LootItemFunctionType HEX_CYPHER = register("hex_cypher", - new LootItemFunctionType(new AddHexToAncientCypherFunc.Serializer())); + new LootItemFunctionType(AddHexToAncientCypherFunc.CODEC)); public static final LootItemFunctionType AMETHYST_SHARD_REDUCER = register("amethyst_shard_reducer", - new LootItemFunctionType(new AmethystReducerFunc.Serializer())); + new LootItemFunctionType(AmethystReducerFunc.CODEC)); private static LootItemFunctionType register(String id, LootItemFunctionType lift) { var old = LOOT_FUNCS.put(modLoc(id), lift); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java index 6398bfea27..28408a2401 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java @@ -1,6 +1,9 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.common.misc.HexMobEffect; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; @@ -23,12 +26,12 @@ public static void register(BiConsumer r) { public static final MobEffect ENLARGE_GRID = make("enlarge_grid", new HexMobEffect(MobEffectCategory.BENEFICIAL, 0xc875ff)) - .addAttributeModifier(HexAttributes.GRID_ZOOM, "d4afaf0f-df37-4253-9fa7-029e8e4415d9", - 0.25, AttributeModifier.Operation.MULTIPLY_TOTAL); + .addAttributeModifier(net.minecraft.core.Holder.direct(HexAttributes.GRID_ZOOM), modLoc("enlarge_grid_modifier"), + 0.25, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); public static final MobEffect SHRINK_GRID = make("shrink_grid", new HexMobEffect(MobEffectCategory.HARMFUL, 0xc0e660)) - .addAttributeModifier(HexAttributes.GRID_ZOOM, "1ce492a9-8bf5-4091-a482-c6d9399e448a", - -0.2, AttributeModifier.Operation.MULTIPLY_TOTAL); + .addAttributeModifier(net.minecraft.core.Holder.direct(HexAttributes.GRID_ZOOM), modLoc("shrink_grid_modifier"), + -0.2, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); private static T make(String id, T effect) { @@ -38,4 +41,15 @@ private static T make(String id, T effect) { } return effect; } + + /** 1.21+ Get Holder for MobEffectInstance; pass level.registryAccess() or entity.registryAccess() */ + public static Holder getHolder(MobEffect effect, net.minecraft.core.HolderLookup.Provider registryAccess) { + for (var e : EFFECTS.entrySet()) { + if (e.getValue() == effect) { + var key = ResourceKey.create(Registries.MOB_EFFECT, e.getKey()); + return registryAccess.lookupOrThrow(Registries.MOB_EFFECT).getOrThrow(key); + } + } + throw new IllegalArgumentException("Effect " + effect + " not registered in HexMobEffects"); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexPotions.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexPotions.java index e86409e77c..0053c7de51 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexPotions.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexPotions.java @@ -1,54 +1,58 @@ package at.petrak.hexcasting.common.lib; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionBrewing; import net.minecraft.world.item.alchemy.Potions; -import net.minecraft.world.item.Items; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.BiConsumer; import static at.petrak.hexcasting.api.HexAPI.modLoc; -import at.petrak.hexcasting.mixin.accessor.AccessorPotionBrewing; public class HexPotions { public static void register(BiConsumer r) { for (var e : POTIONS.entrySet()) { r.accept(e.getValue(), e.getKey()); } - HexPotions.addRecipes(); + } + + /** + * Add Hex Casting potion brewing recipes. Called from Forge's RegisterBrewingRecipesEvent + * (Fabric uses a different approach when that module is enabled). + */ + public static void addRecipes(PotionBrewing.Builder builder) { + builder.addMix(Potions.AWKWARD, HexItems.AMETHYST_DUST, Holder.direct(ENLARGE_GRID)); + builder.addMix(Holder.direct(ENLARGE_GRID), Items.REDSTONE, Holder.direct(ENLARGE_GRID_LONG)); + builder.addMix(Holder.direct(ENLARGE_GRID), Items.GLOWSTONE_DUST, Holder.direct(ENLARGE_GRID_STRONG)); + + builder.addMix(Holder.direct(ENLARGE_GRID), Items.FERMENTED_SPIDER_EYE, Holder.direct(SHRINK_GRID)); + builder.addMix(Holder.direct(ENLARGE_GRID_LONG), Items.FERMENTED_SPIDER_EYE, Holder.direct(SHRINK_GRID_LONG)); + builder.addMix(Holder.direct(ENLARGE_GRID_STRONG), Items.FERMENTED_SPIDER_EYE, Holder.direct(SHRINK_GRID_STRONG)); + + builder.addMix(Holder.direct(SHRINK_GRID), Items.REDSTONE, Holder.direct(SHRINK_GRID_LONG)); + builder.addMix(Holder.direct(SHRINK_GRID), Items.GLOWSTONE_DUST, Holder.direct(SHRINK_GRID_STRONG)); } private static final Map POTIONS = new LinkedHashMap<>(); public static final Potion ENLARGE_GRID = make("enlarge_grid", - new Potion("enlarge_grid", new MobEffectInstance(HexMobEffects.ENLARGE_GRID, 3600))); + new Potion("enlarge_grid", new MobEffectInstance(Holder.direct(HexMobEffects.ENLARGE_GRID), 3600))); public static final Potion ENLARGE_GRID_LONG = make("enlarge_grid_long", - new Potion("enlarge_grid_long", new MobEffectInstance(HexMobEffects.ENLARGE_GRID, 9600))); + new Potion("enlarge_grid_long", new MobEffectInstance(Holder.direct(HexMobEffects.ENLARGE_GRID), 9600))); public static final Potion ENLARGE_GRID_STRONG = make("enlarge_grid_strong", - new Potion("enlarge_grid_strong", new MobEffectInstance(HexMobEffects.ENLARGE_GRID, 1800, 1))); + new Potion("enlarge_grid_strong", new MobEffectInstance(Holder.direct(HexMobEffects.ENLARGE_GRID), 1800, 1))); public static final Potion SHRINK_GRID = make("shrink_grid", - new Potion("shrink_grid", new MobEffectInstance(HexMobEffects.SHRINK_GRID, 3600))); + new Potion("shrink_grid", new MobEffectInstance(Holder.direct(HexMobEffects.SHRINK_GRID), 3600))); public static final Potion SHRINK_GRID_LONG = make("shrink_grid_long", - new Potion("shrink_grid_long", new MobEffectInstance(HexMobEffects.SHRINK_GRID, 9600))); + new Potion("shrink_grid_long", new MobEffectInstance(Holder.direct(HexMobEffects.SHRINK_GRID), 9600))); public static final Potion SHRINK_GRID_STRONG = make("shrink_grid_strong", - new Potion("shrink_grid_strong", new MobEffectInstance(HexMobEffects.SHRINK_GRID, 1800, 1))); - - public static void addRecipes() { - AccessorPotionBrewing.addMix(Potions.AWKWARD, HexItems.AMETHYST_DUST, ENLARGE_GRID); - AccessorPotionBrewing.addMix(ENLARGE_GRID, Items.REDSTONE, ENLARGE_GRID_LONG); - AccessorPotionBrewing.addMix(ENLARGE_GRID, Items.GLOWSTONE_DUST, ENLARGE_GRID_STRONG); - - AccessorPotionBrewing.addMix(ENLARGE_GRID, Items.FERMENTED_SPIDER_EYE, SHRINK_GRID); - AccessorPotionBrewing.addMix(ENLARGE_GRID_LONG, Items.FERMENTED_SPIDER_EYE, SHRINK_GRID_LONG); - AccessorPotionBrewing.addMix(ENLARGE_GRID_STRONG, Items.FERMENTED_SPIDER_EYE, SHRINK_GRID_STRONG); - - AccessorPotionBrewing.addMix(SHRINK_GRID, Items.REDSTONE, SHRINK_GRID_LONG); - AccessorPotionBrewing.addMix(SHRINK_GRID, Items.GLOWSTONE_DUST, SHRINK_GRID_STRONG); - } + new Potion("shrink_grid_strong", new MobEffectInstance(Holder.direct(HexMobEffects.SHRINK_GRID), 1800, 1))); private static T make(String id, T potion) { var old = POTIONS.put(modLoc(id), potion); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexSpecialHandlers.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexSpecialHandlers.java index c69fb9363c..3c8977b1c4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexSpecialHandlers.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexSpecialHandlers.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.lib.hex; import at.petrak.hexcasting.api.casting.castables.SpecialHandler; +import at.petrak.hexcasting.common.casting.actions.SpecialHandlerCompat; import at.petrak.hexcasting.common.casting.actions.math.SpecialHandlerNumberLiteral; import at.petrak.hexcasting.common.casting.actions.stack.SpecialHandlerMask; import net.minecraft.resources.ResourceLocation; @@ -18,6 +19,8 @@ public class HexSpecialHandlers { new SpecialHandlerNumberLiteral.Factory()); public static final SpecialHandler.Factory MASK = make("mask", new SpecialHandlerMask.Factory()); + public static final SpecialHandler.Factory COMPAT = make("compat", + new SpecialHandlerCompat.Factory()); private static SpecialHandler.Factory make(String name, SpecialHandler.Factory handler) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java index 8dac9cfeb0..130a8bcb34 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddHexToAncientCypherFunc.java @@ -4,18 +4,15 @@ import at.petrak.hexcasting.api.casting.iota.IotaType; import at.petrak.hexcasting.api.casting.math.HexDir; import at.petrak.hexcasting.api.casting.math.HexPattern; -import at.petrak.hexcasting.api.mod.HexConfig; -import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.utils.NBTHelper; import at.petrak.hexcasting.api.item.VariantItem; import at.petrak.hexcasting.api.misc.MediaConstants; import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.common.items.magic.ItemAncientCypher; import at.petrak.hexcasting.common.items.magic.ItemPackagedHex; -import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.lib.HexLootFunctions; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonObject; -import com.google.gson.JsonSerializationContext; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.Util; import net.minecraft.util.RandomSource; import net.minecraft.nbt.ListTag; @@ -36,7 +33,11 @@ * is used on both sides */ public class AddHexToAncientCypherFunc extends LootItemConditionalFunction { - public AddHexToAncientCypherFunc(LootItemCondition[] lootItemConditions) { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + inst -> commonFields(inst).apply(inst, AddHexToAncientCypherFunc::new) + ); + + public AddHexToAncientCypherFunc(List lootItemConditions) { super(lootItemConditions); } @@ -61,7 +62,7 @@ public static ItemStack doStatic(ItemStack stack, RandomSource rand) { tag.putLong(ItemAncientCypher.TAG_MAX_MEDIA, 32*MediaConstants.SHARD_UNIT); tag.putInt(VariantItem.TAG_VARIANT, rand.nextInt(8)); - stack.getOrCreateTag().merge(tag); + NBTHelper.getOrCreateTag(stack).merge(tag); return stack; } @@ -76,19 +77,6 @@ public LootItemFunctionType getType() { return HexLootFunctions.HEX_CYPHER; } - public static class Serializer extends LootItemConditionalFunction.Serializer { - @Override - public void serialize(JsonObject json, AddHexToAncientCypherFunc value, JsonSerializationContext ctx) { - super.serialize(json, value, ctx); - } - - @Override - public AddHexToAncientCypherFunc deserialize(JsonObject object, JsonDeserializationContext ctx, - LootItemCondition[] conditions) { - return new AddHexToAncientCypherFunc(conditions); - } - } - // TODO: make this datapackable private static final List> LOOT_HEXES = List.of( new Pair<>("hexcasting.loot_hex.shatter", new String[] {"NORTH_EAST qaq","EAST aa","NORTH_EAST qaq","NORTH_EAST wa","EAST wqaawdd","EAST qaqqqqq"}), diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java index 0d45634db4..e0dbd91e75 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java @@ -8,14 +8,11 @@ import at.petrak.hexcasting.common.items.storage.ItemScroll; import at.petrak.hexcasting.common.lib.HexLootFunctions; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonObject; -import com.google.gson.JsonSerializationContext; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.RandomSource; import net.minecraft.core.Registry; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; @@ -24,6 +21,7 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import java.util.ArrayList; +import java.util.List; /** * Slap a random per-world pattern on the scroll. @@ -32,7 +30,11 @@ * is used on both sides */ public class AddPerWorldPatternToScrollFunc extends LootItemConditionalFunction { - public AddPerWorldPatternToScrollFunc(LootItemCondition[] lootItemConditions) { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + inst -> commonFields(inst).apply(inst, AddPerWorldPatternToScrollFunc::new) + ); + + public AddPerWorldPatternToScrollFunc(List lootItemConditions) { super(lootItemConditions); } @@ -63,17 +65,4 @@ protected ItemStack run(ItemStack stack, LootContext ctx) { public LootItemFunctionType getType() { return HexLootFunctions.PATTERN_SCROLL; } - - public static class Serializer extends LootItemConditionalFunction.Serializer { - @Override - public void serialize(JsonObject json, AddPerWorldPatternToScrollFunc value, JsonSerializationContext ctx) { - super.serialize(json, value, ctx); - } - - @Override - public AddPerWorldPatternToScrollFunc deserialize(JsonObject object, JsonDeserializationContext ctx, - LootItemCondition[] conditions) { - return new AddPerWorldPatternToScrollFunc(conditions); - } - } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AmethystReducerFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AmethystReducerFunc.java index cee38be6dd..49ad7caf45 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/AmethystReducerFunc.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AmethystReducerFunc.java @@ -1,10 +1,9 @@ package at.petrak.hexcasting.common.loot; import at.petrak.hexcasting.common.lib.HexLootFunctions; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonObject; -import com.google.gson.JsonSerializationContext; -import net.minecraft.util.GsonHelper; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.storage.loot.LootContext; @@ -12,10 +11,16 @@ import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import java.util.List; + public class AmethystReducerFunc extends LootItemConditionalFunction { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> commonFields(inst) + .and(Codec.DOUBLE.fieldOf("delta").forGetter(f -> f.delta)) + .apply(inst, AmethystReducerFunc::new)); + public final double delta; - public AmethystReducerFunc(LootItemCondition[] lootItemConditions, double delta) { + public AmethystReducerFunc(List lootItemConditions, double delta) { super(lootItemConditions); this.delta = delta; } @@ -36,19 +41,4 @@ protected ItemStack run(ItemStack stack, LootContext ctx) { public LootItemFunctionType getType() { return HexLootFunctions.AMETHYST_SHARD_REDUCER; } - - public static class Serializer extends LootItemConditionalFunction.Serializer { - @Override - public void serialize(JsonObject json, AmethystReducerFunc value, JsonSerializationContext ctx) { - super.serialize(json, value, ctx); - json.addProperty("delta", value.delta); - } - - @Override - public AmethystReducerFunc deserialize(JsonObject object, JsonDeserializationContext ctx, - LootItemCondition[] conditions) { - var delta = GsonHelper.getAsDouble(object, "delta"); - return new AmethystReducerFunc(conditions, delta); - } - } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java index cb4cee9211..70099d5536 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/HexLootHandler.java @@ -24,53 +24,53 @@ public class HexLootHandler { // In places where it doesn't really make sense to have them lore-wise just put them rarely anyways // to make it less of a PITA for new players - new ScrollInjection(new ResourceLocation("minecraft", "chests/simple_dungeon"), 1), - new ScrollInjection(new ResourceLocation("minecraft", "chests/abandoned_mineshaft"), 1), - new ScrollInjection(new ResourceLocation("minecraft", "chests/bastion_other"), 1), - new ScrollInjection(new ResourceLocation("minecraft", "chests/nether_bridge"), 1), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/simple_dungeon"), 1), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/abandoned_mineshaft"), 1), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/bastion_other"), 1), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/nether_bridge"), 1), - new ScrollInjection(new ResourceLocation("minecraft", "chests/jungle_temple"), 2), - new ScrollInjection(new ResourceLocation("minecraft", "chests/desert_pyramid"), 2), - new ScrollInjection(new ResourceLocation("minecraft", "chests/village/village_cartographer"), 2), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/jungle_temple"), 2), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/desert_pyramid"), 2), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/village/village_cartographer"), 2), - new ScrollInjection(new ResourceLocation("minecraft", "chests/shipwreck_map"), 3), - new ScrollInjection(new ResourceLocation("minecraft", "chests/bastion_treasure"), 3), - new ScrollInjection(new ResourceLocation("minecraft", "chests/end_city_treasure"), 3), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/shipwreck_map"), 3), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/bastion_treasure"), 3), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/end_city_treasure"), 3), // ancient city chests have amethyst in them, thinking emoji - new ScrollInjection(new ResourceLocation("minecraft", "chests/ancient_city"), 4), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/ancient_city"), 4), // wonder what those pillagers are up to with those scrolls - new ScrollInjection(new ResourceLocation("minecraft", "chests/pillager_outpost"), 4), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/pillager_outpost"), 4), // if you manage to find one of these things you deserve a lot of scrolls - new ScrollInjection(new ResourceLocation("minecraft", "chests/woodland_mansion"), 5), - new ScrollInjection(new ResourceLocation("minecraft", "chests/stronghold_library"), 5) + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/woodland_mansion"), 5), + new ScrollInjection(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/stronghold_library"), 5) // you can use the table hexcasting:random_scroll to get exactly 1 scroll and nothing else ); public static final ImmutableList DEFAULT_LORE_INJECTS = ImmutableList.of( - new ResourceLocation("minecraft", "chests/simple_dungeon"), - new ResourceLocation("minecraft", "chests/abandoned_mineshaft"), - new ResourceLocation("minecraft", "chests/pillager_outpost"), - new ResourceLocation("minecraft", "chests/woodland_mansion"), - new ResourceLocation("minecraft", "chests/stronghold_library"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/simple_dungeon"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/abandoned_mineshaft"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/pillager_outpost"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/woodland_mansion"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/stronghold_library"), // >:) - new ResourceLocation("minecraft", "chests/village/village_desert_house"), - new ResourceLocation("minecraft", "chests/village/village_plains_house"), - new ResourceLocation("minecraft", "chests/village/village_savanna_house"), - new ResourceLocation("minecraft", "chests/village/village_snowy_house"), - new ResourceLocation("minecraft", "chests/village/village_taiga_house") + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/village/village_desert_house"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/village/village_plains_house"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/village/village_savanna_house"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/village/village_snowy_house"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/village/village_taiga_house") ); public static final ImmutableList DEFAULT_CYPHER_INJECTS = ImmutableList.of( - new ResourceLocation("minecraft", "chests/simple_dungeon"), - new ResourceLocation("minecraft", "chests/abandoned_mineshaft"), - new ResourceLocation("minecraft", "chests/stronghold_corridor"), - new ResourceLocation("minecraft", "chests/jungle_temple"), - new ResourceLocation("minecraft", "chests/desert_pyramid"), - new ResourceLocation("minecraft", "chests/ancient_city"), - new ResourceLocation("minecraft", "chests/nether_bridge") + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/simple_dungeon"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/abandoned_mineshaft"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/stronghold_corridor"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/jungle_temple"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/desert_pyramid"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/ancient_city"), + ResourceLocation.fromNamespaceAndPath("minecraft", "chests/nether_bridge") // you can use the table hexcasting:random_cypher to get exactly 1 cypher and nothing else ); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/misc/AkashicTreeGrower.java b/Common/src/main/java/at/petrak/hexcasting/common/misc/AkashicTreeGrower.java index 4e235769e8..8786b44cd0 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/misc/AkashicTreeGrower.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/misc/AkashicTreeGrower.java @@ -4,24 +4,31 @@ import com.google.common.collect.Lists; import net.minecraft.resources.ResourceKey; import net.minecraft.util.RandomSource; -import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.block.grower.TreeGrower; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import java.util.List; +import java.util.Optional; -public class AkashicTreeGrower extends AbstractTreeGrower { - public static final AkashicTreeGrower INSTANCE = new AkashicTreeGrower(); - +public class AkashicTreeGrower { public static final List>> GROWERS = Lists.newArrayList(); + private static final TreeGrower[] TREE_GROWERS = new TreeGrower[3]; + public static void init() { GROWERS.add(HexConfiguredFeatures.AMETHYST_EDIFIED_TREE); GROWERS.add(HexConfiguredFeatures.AVENTURINE_EDIFIED_TREE); GROWERS.add(HexConfiguredFeatures.CITRINE_EDIFIED_TREE); + TREE_GROWERS[0] = new TreeGrower("akashic_amethyst", Optional.of(GROWERS.get(0)), Optional.empty(), Optional.empty()); + TREE_GROWERS[1] = new TreeGrower("akashic_aventurine", Optional.of(GROWERS.get(1)), Optional.empty(), Optional.empty()); + TREE_GROWERS[2] = new TreeGrower("akashic_citrine", Optional.of(GROWERS.get(2)), Optional.empty(), Optional.empty()); } - @Override - protected ResourceKey> getConfiguredFeature(RandomSource pRandom, boolean pLargeHive) { - return GROWERS.get(pRandom.nextInt(GROWERS.size())); + public static boolean growTree(net.minecraft.server.level.ServerLevel level, + net.minecraft.world.level.chunk.ChunkGenerator chunkGen, + net.minecraft.core.BlockPos pos, + net.minecraft.world.level.block.state.BlockState state, + RandomSource random) { + return TREE_GROWERS[random.nextInt(TREE_GROWERS.length)].growTree(level, chunkGen, pos, state, random); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/misc/PatternDisplayHelper.java b/Common/src/main/java/at/petrak/hexcasting/common/misc/PatternDisplayHelper.java new file mode 100644 index 0000000000..0640f527ec --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/misc/PatternDisplayHelper.java @@ -0,0 +1,60 @@ +package at.petrak.hexcasting.common.misc; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.api.casting.PatternShapeMatch; +import at.petrak.hexcasting.api.casting.iota.PatternIota; +import at.petrak.hexcasting.api.casting.math.HexPattern; +import at.petrak.hexcasting.common.casting.PatternRegistryManifest; +import at.petrak.hexcasting.common.lib.HexItems; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +/** + * Fallback pattern display when Inline mod is not present. + * Provides pattern name resolution and display components without Inline dependency. + */ +public final class PatternDisplayHelper { + + /** + * Get the display name for a pattern (e.g. "Great Spells" for a known action). + */ + @NotNull + public static Component getPatternName(@NotNull HexPattern pattern) { + try { + PatternShapeMatch shapeMatch = PatternRegistryManifest.matchPattern(pattern, null, false); + if (shapeMatch instanceof PatternShapeMatch.Normal normMatch) { + return HexAPI.instance().getActionI18n(normMatch.key, false); + } + if (shapeMatch instanceof PatternShapeMatch.Special specialMatch) { + return HexAPI.instance().getSpecialHandlerI18n(specialMatch.key); + } + } catch (Exception e) { + // nop + } + return PatternIota.displayNonInline(pattern); + } + + /** + * Get a component for displaying a pattern in tooltips/item names. + * When withHoverAndClick is true, adds hover (scroll preview) and click-to-copy. + */ + @NotNull + public static Component getDisplayComponent(@NotNull HexPattern pattern, boolean withHoverAndClick) { + MutableComponent text = Component.literal(pattern.toString()).withStyle(ChatFormatting.WHITE); + if (withHoverAndClick) { + ItemStack scrollStack = new ItemStack(HexItems.SCROLL_MEDIUM); + HexItems.SCROLL_MEDIUM.writeDatum(scrollStack, new PatternIota(pattern)); + scrollStack.set(DataComponents.CUSTOM_NAME, getPatternName(pattern).copy().withStyle(ChatFormatting.WHITE)); + HoverEvent he = new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(scrollStack)); + ClickEvent ce = new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, pattern.toString()); + text = text.withStyle(s -> s.withHoverEvent(he).withClickEvent(ce)); + } + return text; + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/IMessage.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/IMessage.java index ec7cdd8ef4..b1fc0ebe49 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/IMessage.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/IMessage.java @@ -2,11 +2,12 @@ import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; // https://github.com/VazkiiMods/Botania/blob/1.18.x/Common/src/main/java/vazkii/botania/network/IPacket.java // yoink -public interface IMessage { +public interface IMessage extends CustomPacketPayload { default FriendlyByteBuf toBuf() { var ret = new FriendlyByteBuf(Unpooled.buffer()); serialize(ret); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgBeepS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgBeepS2C.java index 852fc675af..a4f36ca7af 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgBeepS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgBeepS2C.java @@ -1,9 +1,11 @@ package at.petrak.hexcasting.common.msgs; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundSource; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; @@ -13,14 +15,21 @@ public record MsgBeepS2C(Vec3 target, int note, NoteBlockInstrument instrument) implements IMessage { public static final ResourceLocation ID = modLoc("beep"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgBeepS2C::serialize, MsgBeepS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgBeepS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgBeepS2C deserialize(FriendlyByteBuf buf) { var x = buf.readDouble(); var y = buf.readDouble(); var z = buf.readDouble(); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgCastParticleS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgCastParticleS2C.java index 9ec659b8b6..1252e8911e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgCastParticleS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgCastParticleS2C.java @@ -4,9 +4,11 @@ import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.client.ClientTickCounter; import at.petrak.hexcasting.common.particles.ConjureParticleOptions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; @@ -20,14 +22,21 @@ */ public record MsgCastParticleS2C(ParticleSpray spray, FrozenPigment colorizer) implements IMessage { public static final ResourceLocation ID = modLoc("cprtcl"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgCastParticleS2C::serialize, MsgCastParticleS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgCastParticleS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgCastParticleS2C deserialize(FriendlyByteBuf buf) { var posX = buf.readDouble(); var posY = buf.readDouble(); var posZ = buf.readDouble(); @@ -37,7 +46,7 @@ public static MsgCastParticleS2C deserialize(ByteBuf buffer) { var fuzziness = buf.readDouble(); var spread = buf.readDouble(); var count = buf.readInt(); - var tag = buf.readAnySizeNbt(); + var tag = buf.readNbt(); var colorizer = FrozenPigment.fromNBT(tag); return new MsgCastParticleS2C( new ParticleSpray(new Vec3(posX, posY, posZ), new Vec3(velX, velY, velZ), fuzziness, spread, count), diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgClearSpiralPatternsS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgClearSpiralPatternsS2C.java index 1f454ba700..34db91a582 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgClearSpiralPatternsS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgClearSpiralPatternsS2C.java @@ -1,9 +1,11 @@ package at.petrak.hexcasting.common.msgs; import at.petrak.hexcasting.xplat.IClientXplatAbstractions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import java.util.UUID; @@ -12,14 +14,21 @@ public record MsgClearSpiralPatternsS2C(UUID playerUUID) implements IMessage { public static final ResourceLocation ID = modLoc("clr_spi_pats_sc"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgClearSpiralPatternsS2C::serialize, MsgClearSpiralPatternsS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgClearSpiralPatternsS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgClearSpiralPatternsS2C deserialize(FriendlyByteBuf buf) { var player = buf.readUUID(); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternC2S.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternC2S.java index ce19d966b3..9a4629aa2a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternC2S.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternC2S.java @@ -3,8 +3,10 @@ import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; import at.petrak.hexcasting.api.casting.eval.env.StaffCastEnv; import at.petrak.hexcasting.api.casting.math.HexPattern; -import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -23,14 +25,21 @@ public record MsgNewSpellPatternC2S(InteractionHand handUsed, HexPattern pattern List resolvedPatterns) implements IMessage { public static final ResourceLocation ID = modLoc("pat_cs"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgNewSpellPatternC2S::serialize, MsgNewSpellPatternC2S::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgNewSpellPatternC2S deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgNewSpellPatternC2S deserialize(FriendlyByteBuf buf) { var hand = buf.readEnum(InteractionHand.class); var pattern = HexPattern.fromNBT(buf.readNbt()); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternS2C.java index cadf3dd100..1052d1d7d1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpellPatternS2C.java @@ -4,9 +4,11 @@ import at.petrak.hexcasting.api.casting.eval.ResolvedPatternType; import at.petrak.hexcasting.client.gui.GuiSpellcasting; import at.petrak.hexcasting.common.lib.HexSounds; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import java.util.Optional; @@ -18,21 +20,28 @@ */ public record MsgNewSpellPatternS2C(ExecutionClientView info, int index) implements IMessage { public static final ResourceLocation ID = modLoc("pat_sc"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgNewSpellPatternS2C::serialize, MsgNewSpellPatternS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgNewSpellPatternS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgNewSpellPatternS2C deserialize(FriendlyByteBuf buf) { var isStackEmpty = buf.readBoolean(); var resolutionType = buf.readEnum(ResolvedPatternType.class); var index = buf.readInt(); - var stack = buf.readList(FriendlyByteBuf::readNbt); - var raven = buf.readOptional(FriendlyByteBuf::readNbt).orElse(null); + var stack = buf.readList(fbb -> fbb.readNbt()); + var raven = buf.readOptional(fbb -> fbb.readNbt()).orElse(null); return new MsgNewSpellPatternS2C( new ExecutionClientView(isStackEmpty, resolutionType, stack, raven), index @@ -45,8 +54,8 @@ public void serialize(FriendlyByteBuf buf) { buf.writeEnum(this.info.getResolutionType()); buf.writeInt(this.index); - buf.writeCollection(this.info.getStackDescs(), FriendlyByteBuf::writeNbt); - buf.writeOptional(Optional.ofNullable(this.info.getRavenmind()), FriendlyByteBuf::writeNbt); + buf.writeCollection(this.info.getStackDescs(), (fbb, tag) -> fbb.writeNbt(tag)); + buf.writeOptional(Optional.ofNullable(this.info.getRavenmind()), (fbb, tag) -> fbb.writeNbt(tag)); } public static void handle(MsgNewSpellPatternS2C self) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpiralPatternsS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpiralPatternsS2C.java index 9c5a02180c..423488ffae 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpiralPatternsS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewSpiralPatternsS2C.java @@ -2,9 +2,11 @@ import at.petrak.hexcasting.api.casting.math.HexPattern; import at.petrak.hexcasting.xplat.IClientXplatAbstractions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import java.util.ArrayList; @@ -15,17 +17,24 @@ public record MsgNewSpiralPatternsS2C(UUID playerUUID, List patterns, int lifetime) implements IMessage { public static final ResourceLocation ID = modLoc("spi_pats_sc"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgNewSpiralPatternsS2C::serialize, MsgNewSpiralPatternsS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgNewSpiralPatternsS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgNewSpiralPatternsS2C deserialize(FriendlyByteBuf buf) { var player = buf.readUUID(); - var patterns = buf.readCollection(ArrayList::new, buff -> HexPattern.fromNBT(buf.readNbt())); + var patterns = buf.readCollection(ArrayList::new, fbb -> HexPattern.fromNBT(fbb.readNbt())); var lifetime = buf.readInt(); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewWallScrollS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewWallScrollS2C.java index 67e77248cc..68dfda4505 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewWallScrollS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgNewWallScrollS2C.java @@ -6,6 +6,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -16,6 +19,14 @@ public record MsgNewWallScrollS2C(ClientboundAddEntityPacket inner, BlockPos pos, Direction dir, ItemStack scrollItem, boolean showsStrokeOrder, int blockSize) implements IMessage { public static final ResourceLocation ID = modLoc("wallscr"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgNewWallScrollS2C::serialize, MsgNewWallScrollS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { @@ -24,19 +35,21 @@ public ResourceLocation getFabricId() { @Override public void serialize(FriendlyByteBuf buf) { - inner.write(buf); + var rfb = (RegistryFriendlyByteBuf) buf; + ClientboundAddEntityPacket.STREAM_CODEC.encode(rfb, inner); buf.writeBlockPos(pos); buf.writeByte(dir.ordinal()); - buf.writeItem(scrollItem); + ItemStack.STREAM_CODEC.encode(rfb, scrollItem); buf.writeBoolean(showsStrokeOrder); buf.writeVarInt(blockSize); } public static MsgNewWallScrollS2C deserialize(FriendlyByteBuf buf) { - var inner = new ClientboundAddEntityPacket(buf); + var rfb = (RegistryFriendlyByteBuf) buf; + var inner = ClientboundAddEntityPacket.STREAM_CODEC.decode(rfb); var pos = buf.readBlockPos(); var dir = HexUtils.getSafe(Direction.values(), buf.readByte()); - var scroll = buf.readItem(); + var scroll = ItemStack.STREAM_CODEC.decode(rfb); var strokeOrder = buf.readBoolean(); var blockSize = buf.readVarInt(); return new MsgNewWallScrollS2C(inner, pos, dir, scroll, strokeOrder, blockSize); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java index a06e608bdb..4094ff7704 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java @@ -2,10 +2,12 @@ import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; import at.petrak.hexcasting.client.gui.GuiSpellcasting; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; @@ -23,21 +25,28 @@ public record MsgOpenSpellGuiS2C(InteractionHand hand, List pat ) implements IMessage { public static final ResourceLocation ID = modLoc("cgui"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgOpenSpellGuiS2C::serialize, MsgOpenSpellGuiS2C::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgOpenSpellGuiS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgOpenSpellGuiS2C deserialize(FriendlyByteBuf buf) { var hand = buf.readEnum(InteractionHand.class); - var patterns = buf.readList(fbb -> ResolvedPattern.fromNBT(fbb.readAnySizeNbt())); + var patterns = buf.readList(fbb -> ResolvedPattern.fromNBT(fbb.readNbt())); - var stack = buf.readList(FriendlyByteBuf::readNbt); - var raven = buf.readAnySizeNbt(); + var stack = buf.readList(fbb -> fbb.readNbt()); + var raven = buf.readNbt(); var parenCount = buf.readVarInt(); @@ -49,7 +58,7 @@ public void serialize(FriendlyByteBuf buf) { buf.writeCollection(this.patterns, (fbb, pat) -> fbb.writeNbt(pat.serializeToNBT())); - buf.writeCollection(this.stack, FriendlyByteBuf::writeNbt); + buf.writeCollection(this.stack, (fbb, tag) -> fbb.writeNbt(tag)); buf.writeNbt(this.ravenmind); buf.writeVarInt(this.parenCount); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgRecalcWallScrollDisplayS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgRecalcWallScrollDisplayS2C.java index 137c97f534..5736429309 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgRecalcWallScrollDisplayS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgRecalcWallScrollDisplayS2C.java @@ -1,9 +1,11 @@ package at.petrak.hexcasting.common.msgs; import at.petrak.hexcasting.common.entities.EntityWallScroll; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import static at.petrak.hexcasting.api.HexAPI.modLoc; @@ -13,9 +15,16 @@ */ public record MsgRecalcWallScrollDisplayS2C(int entityId, boolean showStrokeOrder) implements IMessage { public static final ResourceLocation ID = modLoc("redoscroll"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgRecalcWallScrollDisplayS2C::serialize, MsgRecalcWallScrollDisplayS2C::deserialize); - public static MsgRecalcWallScrollDisplayS2C deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } + + public static MsgRecalcWallScrollDisplayS2C deserialize(FriendlyByteBuf buf) { var id = buf.readVarInt(); var showStrokeOrder = buf.readBoolean(); return new MsgRecalcWallScrollDisplayS2C(id, showStrokeOrder); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgShiftScrollC2S.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgShiftScrollC2S.java index e1f4d354a6..0e943432cb 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgShiftScrollC2S.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgShiftScrollC2S.java @@ -6,9 +6,11 @@ import at.petrak.hexcasting.common.items.storage.ItemSpellbook; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.lib.HexSounds; -import io.netty.buffer.ByteBuf; import net.minecraft.ChatFormatting; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; @@ -27,15 +29,22 @@ public record MsgShiftScrollC2S(double mainHandDelta, double offHandDelta, boolean isCtrl, boolean invertSpellbook, boolean invertAbacus) implements IMessage { public static final ResourceLocation ID = modLoc("scroll"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgShiftScrollC2S::serialize, MsgShiftScrollC2S::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgShiftScrollC2S deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); - var mainHandDelta = buf.readDouble(); + public static MsgShiftScrollC2S deserialize(FriendlyByteBuf buf) { + double mainHandDelta = buf.readDouble(); var offHandDelta = buf.readDouble(); var isCtrl = buf.readBoolean(); var invertSpellbook = buf.readBoolean(); @@ -75,26 +84,26 @@ private void spellbook(ServerPlayer sender, InteractionHand hand, ItemStack stac delta = -delta; } - var newIdx = ItemSpellbook.rotatePageIdx(stack, delta < 0.0); + var newIdx = ItemSpellbook.rotatePageIdx(stack, delta < 0.0, sender.registryAccess()); var len = ItemSpellbook.highestPage(stack); var sealed = ItemSpellbook.isSealed(stack); MutableComponent component; - if (hand == InteractionHand.OFF_HAND && stack.hasCustomHoverName()) { + if (hand == InteractionHand.OFF_HAND && stack.get(net.minecraft.core.component.DataComponents.CUSTOM_NAME) != null) { if (sealed) { component = Component.translatable("hexcasting.tooltip.spellbook.page_with_name.sealed", Component.literal(String.valueOf(newIdx)).withStyle(ChatFormatting.WHITE), Component.literal(String.valueOf(len)).withStyle(ChatFormatting.WHITE), - Component.literal("").withStyle(stack.getRarity().color, ChatFormatting.ITALIC) + Component.literal("").withStyle(stack.getRarity().color(), ChatFormatting.ITALIC) .append(stack.getHoverName()), Component.translatable("hexcasting.tooltip.spellbook.sealed").withStyle(ChatFormatting.GOLD)); } else { component = Component.translatable("hexcasting.tooltip.spellbook.page_with_name", Component.literal(String.valueOf(newIdx)).withStyle(ChatFormatting.WHITE), Component.literal(String.valueOf(len)).withStyle(ChatFormatting.WHITE), - Component.literal("").withStyle(stack.getRarity().color, ChatFormatting.ITALIC) + Component.literal("").withStyle(stack.getRarity().color(), ChatFormatting.ITALIC) .append(stack.getHoverName())); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java b/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java index 79df382994..c4ddd8fc96 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java @@ -5,9 +5,12 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.mojang.serialization.MapCodec; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import java.util.Locale; @@ -17,50 +20,28 @@ public ParticleType getType() { return HexParticles.CONJURE_PARTICLE; } - @Override - public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeInt(this.color); - } - - @Override - public String writeToString() { - return String.format(Locale.ROOT, "%s %s", this.color); - } - - public static final Deserializer DESERIALIZER = new Deserializer<>() { - @Override - public ConjureParticleOptions fromCommand(ParticleType type, - StringReader reader) throws CommandSyntaxException { - - reader.expect(' '); - var color = reader.readInt(); - return new ConjureParticleOptions(color); - } - - @Override - public ConjureParticleOptions fromNetwork(ParticleType type, - FriendlyByteBuf buf) { - var col = buf.readInt(); - return new ConjureParticleOptions(col); - } - }; - public static class Type extends ParticleType { public Type(boolean pOverrideLimiter) { - super(pOverrideLimiter, DESERIALIZER); + super(pOverrideLimiter); } - public static final Codec CODEC = RecordCodecBuilder.create( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( - Codec.INT.fieldOf("color") - .forGetter((ConjureParticleOptions o) -> o.color) - ) - .apply(instance, ConjureParticleOptions::new) + Codec.INT.fieldOf("color").forGetter(ConjureParticleOptions::color) + ).apply(instance, ConjureParticleOptions::new) ); + public static final StreamCodec STREAM_CODEC = + StreamCodec.composite(ByteBufCodecs.INT, ConjureParticleOptions::color, ConjureParticleOptions::new); + @Override - public Codec codec() { + public MapCodec codec() { return CODEC; } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/BrainsweepRecipe.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/BrainsweepRecipe.java index 8f6db1efb0..9743f0171a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/BrainsweepRecipe.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/BrainsweepRecipe.java @@ -4,15 +4,24 @@ import at.petrak.hexcasting.common.recipe.ingredient.StateIngredientHelper; import at.petrak.hexcasting.common.recipe.ingredient.brainsweep.BrainsweepeeIngredient; import com.google.gson.JsonObject; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Decoder; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.Encoder; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.Container; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; @@ -28,12 +37,11 @@ public record BrainsweepRecipe( BrainsweepeeIngredient entityIn, long mediaCost, BlockState result -) implements Recipe { +) implements Recipe { public boolean matches(BlockState blockIn, Entity victim, ServerLevel level) { return this.blockIn.test(blockIn) && this.entityIn.test(victim, level); } - @Override public ResourceLocation getId() { return id; } @@ -51,12 +59,12 @@ public RecipeSerializer getSerializer() { // in order to get this to be a "Recipe" we need to do a lot of bending-over-backwards // to get the implementation to be satisfied even though we never use it @Override - public boolean matches(Container pContainer, Level pLevel) { + public boolean matches(RecipeInput pContainer, Level pLevel) { return false; } @Override - public ItemStack assemble(Container pContainer, RegistryAccess access) { + public ItemStack assemble(RecipeInput pContainer, HolderLookup.Provider registries) { return ItemStack.EMPTY; } @@ -66,7 +74,7 @@ public boolean canCraftInDimensions(int pWidth, int pHeight) { } @Override - public ItemStack getResultItem(RegistryAccess registryAccess) { + public ItemStack getResultItem(HolderLookup.Provider registries) { return ItemStack.EMPTY.copy(); } @@ -84,30 +92,113 @@ public static BlockState copyProperties(BlockState original, BlockState copyTo) } public static class Serializer extends RecipeSerializerBase { - @Override - public @NotNull BrainsweepRecipe fromJson(ResourceLocation recipeID, JsonObject json) { - var blockIn = StateIngredientHelper.deserialize(GsonHelper.getAsJsonObject(json, "blockIn")); - var villagerIn = BrainsweepeeIngredient.deserialize(GsonHelper.getAsJsonObject(json, "entityIn")); - var cost = GsonHelper.getAsInt(json, "cost"); - var result = StateIngredientHelper.readBlockState(GsonHelper.getAsJsonObject(json, "result")); - return new BrainsweepRecipe(recipeID, blockIn, villagerIn, cost, result); - } + private static final Codec STATE_INGREDIENT_CODEC = Codec.of( + new Encoder<>() { + @Override + public DataResult encode(StateIngredient input, DynamicOps ops, T prefix) { + try { + return DataResult.success(new Dynamic<>(JsonOps.INSTANCE, input.serialize()).convert(ops).getValue()); + } catch (Exception e) { + return DataResult.error(() -> "Failed to encode StateIngredient: " + e.getMessage()); + } + } + }, + new Decoder<>() { + @Override + public DataResult> decode(DynamicOps ops, T input) { + try { + JsonObject obj = new Dynamic<>(ops, input).convert(JsonOps.INSTANCE).getValue().getAsJsonObject(); + return DataResult.success(com.mojang.datafixers.util.Pair.of( + StateIngredientHelper.deserialize(obj), input)); + } catch (Exception e) { + return DataResult.error(() -> e.getMessage()); + } + } + } + ); + + private static final Codec BRAINSWEEPEE_CODEC = Codec.of( + new Encoder<>() { + @Override + public DataResult encode(BrainsweepeeIngredient input, DynamicOps ops, T prefix) { + try { + return DataResult.success(new Dynamic<>(JsonOps.INSTANCE, input.serialize()).convert(ops).getValue()); + } catch (Exception e) { + return DataResult.error(() -> "Failed to encode BrainsweepeeIngredient: " + e.getMessage()); + } + } + }, + new Decoder<>() { + @Override + public DataResult> decode(DynamicOps ops, T input) { + try { + JsonObject obj = new Dynamic<>(ops, input).convert(JsonOps.INSTANCE).getValue().getAsJsonObject(); + return DataResult.success(com.mojang.datafixers.util.Pair.of( + BrainsweepeeIngredient.deserialize(obj), input)); + } catch (Exception e) { + return DataResult.error(() -> e.getMessage()); + } + } + } + ); + + private static final Codec BLOCKSTATE_JSON_CODEC = Codec.of( + new Encoder<>() { + @Override + public DataResult encode(BlockState input, DynamicOps ops, T prefix) { + try { + return DataResult.success(new Dynamic<>(JsonOps.INSTANCE, StateIngredientHelper.serializeBlockState(input)).convert(ops).getValue()); + } catch (Exception e) { + return DataResult.error(() -> "Failed to encode BlockState: " + e.getMessage()); + } + } + }, + new Decoder<>() { + @Override + public DataResult> decode(DynamicOps ops, T input) { + try { + JsonObject obj = new Dynamic<>(ops, input).convert(JsonOps.INSTANCE).getValue().getAsJsonObject(); + return DataResult.success(com.mojang.datafixers.util.Pair.of( + StateIngredientHelper.readBlockState(obj), input)); + } catch (Exception e) { + return DataResult.error(() -> e.getMessage()); + } + } + } + ); + + private static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec(inst -> inst.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(BrainsweepRecipe::id), + STATE_INGREDIENT_CODEC.fieldOf("blockIn").forGetter(BrainsweepRecipe::blockIn), + BRAINSWEEPEE_CODEC.fieldOf("entityIn").forGetter(BrainsweepRecipe::entityIn), + Codec.LONG.fieldOf("cost").forGetter(BrainsweepRecipe::mediaCost), + BLOCKSTATE_JSON_CODEC.fieldOf("result").forGetter(BrainsweepRecipe::result) + ).apply(inst, BrainsweepRecipe::new)); @Override - public void toNetwork(FriendlyByteBuf buf, BrainsweepRecipe recipe) { - recipe.blockIn.write(buf); - recipe.entityIn.wrapWrite(buf); - buf.writeVarLong(recipe.mediaCost); - buf.writeVarInt(Block.getId(recipe.result)); + public MapCodec codec() { + return MAP_CODEC; } @Override - public @NotNull BrainsweepRecipe fromNetwork(ResourceLocation recipeID, FriendlyByteBuf buf) { - var blockIn = StateIngredientHelper.read(buf); - var brainsweepeeIn = BrainsweepeeIngredient.read(buf); - var cost = buf.readVarLong(); - var result = Block.stateById(buf.readVarInt()); - return new BrainsweepRecipe(recipeID, blockIn, brainsweepeeIn, cost, result); + public StreamCodec streamCodec() { + return StreamCodec.of( + (buf, recipe) -> { + buf.writeResourceLocation(recipe.id); + recipe.blockIn.write(buf); + recipe.entityIn.wrapWrite(buf); + buf.writeVarLong(recipe.mediaCost); + buf.writeVarInt(Block.getId(recipe.result)); + }, + buf -> { + var id = buf.readResourceLocation(); + var blockIn = StateIngredientHelper.read(buf); + var brainsweepeeIn = BrainsweepeeIngredient.read(buf); + var cost = buf.readVarLong(); + var result = Block.stateById(buf.readVarInt()); + return new BrainsweepRecipe(id, blockIn, brainsweepeeIn, cost, result); + } + ); } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealSpellbookRecipe.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealSpellbookRecipe.java index 570d6631be..4bdbc61ff3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealSpellbookRecipe.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealSpellbookRecipe.java @@ -6,9 +6,7 @@ import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.core.HolderLookup; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.*; @@ -32,15 +30,15 @@ private static NonNullList createIngredients() { return ingredients; } - public SealSpellbookRecipe(ResourceLocation id, CraftingBookCategory category) { - super(id, "", category, getSealedStack(), createIngredients()); + public SealSpellbookRecipe(CraftingBookCategory category) { + super("", category, getSealedStack(), createIngredients()); } @Override - public @NotNull ItemStack assemble(CraftingContainer inv, RegistryAccess access) { + public @NotNull ItemStack assemble(CraftingInput inv, HolderLookup.Provider registries) { ItemStack out = ItemStack.EMPTY; - for (int i = 0; i < inv.getContainerSize(); i++) { + for (int i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (stack.is(HexItems.SPELLBOOK)) { out = stack.copy(); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealThingsRecipe.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealThingsRecipe.java index 365d68fe59..82c009e133 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealThingsRecipe.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/SealThingsRecipe.java @@ -4,12 +4,11 @@ import at.petrak.hexcasting.common.items.storage.ItemFocus; import at.petrak.hexcasting.common.items.storage.ItemSpellbook; import at.petrak.hexcasting.common.lib.HexItems; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.HolderLookup; import net.minecraft.util.StringRepresentable; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; @@ -26,8 +25,8 @@ public class SealThingsRecipe extends CustomRecipe { public static final SimpleCraftingRecipeSerializer SPELLBOOK_SERIALIZER = new SimpleCraftingRecipeSerializer<>(SealThingsRecipe::spellbook); - public SealThingsRecipe(ResourceLocation id, CraftingBookCategory category, Sealee sealee) { - super(id, category); + public SealThingsRecipe(CraftingBookCategory category, Sealee sealee) { + super(category); this.sealee = sealee; } @@ -38,11 +37,11 @@ public boolean canCraftInDimensions(int width, int height) { } @Override - public boolean matches(CraftingContainer container, Level level) { + public boolean matches(CraftingInput container, Level level) { boolean foundComb = false; boolean foundSealee = false; - for (int i = 0; i < container.getContainerSize(); i++) { + for (int i = 0; i < container.size(); i++) { var stack = container.getItem(i); if (this.sealee.isCorrectSealee(stack)) { if (foundSealee) return false; @@ -57,10 +56,10 @@ public boolean matches(CraftingContainer container, Level level) { } @Override - public ItemStack assemble(CraftingContainer inv, RegistryAccess registryAccess) { + public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registries) { ItemStack sealee = ItemStack.EMPTY; - for (int i = 0; i < inv.getContainerSize(); i++) { + for (int i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (this.sealee.isCorrectSealee(stack)) { sealee = stack.copy(); @@ -84,12 +83,12 @@ public ItemStack assemble(CraftingContainer inv, RegistryAccess registryAccess) }; } - public static SealThingsRecipe focus(ResourceLocation id, CraftingBookCategory category) { - return new SealThingsRecipe(id, category, Sealee.FOCUS); + public static SealThingsRecipe focus(CraftingBookCategory category) { + return new SealThingsRecipe(category, Sealee.FOCUS); } - public static SealThingsRecipe spellbook(ResourceLocation id, CraftingBookCategory category) { - return new SealThingsRecipe(id, category, Sealee.SPELLBOOK); + public static SealThingsRecipe spellbook(CraftingBookCategory category) { + return new SealThingsRecipe(category, Sealee.SPELLBOOK); } public enum Sealee implements StringRepresentable { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlockState.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlockState.java index c1018f47df..adc8c51ae9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlockState.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientBlockState.java @@ -56,7 +56,7 @@ public List getDisplayedStacks() { @Nullable @Override public List descriptionTooltip() { - ImmutableMap, Comparable> map = state.getValues(); + Map, Comparable> map = ImmutableMap.copyOf(state.getValues()); if (map.isEmpty()) { return StateIngredient.super.descriptionTooltip(); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientHelper.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientHelper.java index 97e09d9d36..4d498a913e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientHelper.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/StateIngredientHelper.java @@ -51,20 +51,20 @@ public static StateIngredient tagExcluding(TagKey tag, StateIngredient... public static StateIngredient deserialize(JsonObject object) { switch (GsonHelper.getAsString(object, "type")) { case "tag": - return new StateIngredientTag(new ResourceLocation(GsonHelper.getAsString(object, "tag"))); + return new StateIngredientTag(ResourceLocation.parse(GsonHelper.getAsString(object, "tag"))); case "block": return new StateIngredientBlock( - BuiltInRegistries.BLOCK.get(new ResourceLocation(GsonHelper.getAsString(object, "block")))); + BuiltInRegistries.BLOCK.get(ResourceLocation.parse(GsonHelper.getAsString(object, "block")))); case "state": return new StateIngredientBlockState(readBlockState(object)); case "blocks": List blocks = new ArrayList<>(); for (JsonElement element : GsonHelper.getAsJsonArray(object, "blocks")) { - blocks.add(BuiltInRegistries.BLOCK.get(new ResourceLocation(element.getAsString()))); + blocks.add(BuiltInRegistries.BLOCK.get(ResourceLocation.parse(element.getAsString()))); } return new StateIngredientBlocks(blocks); case "tag_excluding": - ResourceLocation tag = new ResourceLocation(GsonHelper.getAsString(object, "tag")); + ResourceLocation tag = ResourceLocation.parse(GsonHelper.getAsString(object, "tag")); List ingr = new ArrayList<>(); for (JsonElement element : GsonHelper.getAsJsonArray(object, "exclude")) { ingr.add(deserialize(GsonHelper.convertToJsonObject(element, "exclude entry"))); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/VillagerIngredient.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/VillagerIngredient.java index d3cf2e63ef..9272af3e22 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/VillagerIngredient.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/VillagerIngredient.java @@ -184,12 +184,12 @@ public void write(FriendlyByteBuf buf) { public static VillagerIngredient deserialize(JsonObject json) { VillagerProfession profession = null; if (json.has("profession") && !json.get("profession").isJsonNull()) { - profession = BuiltInRegistries.VILLAGER_PROFESSION.get(new ResourceLocation(GsonHelper.getAsString(json, + profession = BuiltInRegistries.VILLAGER_PROFESSION.get(ResourceLocation.parse(GsonHelper.getAsString(json, "profession"))); } VillagerType biome = null; if (json.has("biome") && !json.get("biome").isJsonNull()) { - biome = BuiltInRegistries.VILLAGER_TYPE.get(new ResourceLocation(GsonHelper.getAsString(json, "biome"))); + biome = BuiltInRegistries.VILLAGER_TYPE.get(ResourceLocation.parse(GsonHelper.getAsString(json, "biome"))); } int minLevel = GsonHelper.getAsInt(json, "minLevel"); return new VillagerIngredient(profession, biome, minLevel); diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/HexAdvancements.java b/Common/src/main/java/at/petrak/hexcasting/datagen/HexAdvancements.java index d095b06044..1f3243f50c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/HexAdvancements.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/HexAdvancements.java @@ -46,7 +46,7 @@ public void generate(HolderLookup.Provider provider, Consumer consu .display(new DisplayInfo(new ItemStack(Items.BUDDING_AMETHYST), Component.translatable("advancement.hexcasting:root"), Component.translatable("advancement.hexcasting:root.desc"), - new ResourceLocation("minecraft", "textures/block/calcite.png"), + ResourceLocation.fromNamespaceAndPath("minecraft", "textures/block/calcite.png"), FrameType.TASK, true, true, true)) // the only thing making this vaguely tolerable is the knowledge the json files are worse somehow .addCriterion("has_charged_amethyst", InventoryChangeTrigger.TriggerInstance.hasItems( @@ -58,7 +58,7 @@ public void generate(HolderLookup.Provider provider, Consumer consu .display(new DisplayInfo(new ItemStack(HexItems.CREATIVE_UNLOCKER), Component.translatable("advancement.hexcasting:creative_unlocker"), Component.translatable("advancement.hexcasting:creative_unlocker.desc"), - new ResourceLocation("minecraft", "textures/block/calcite.png"), + ResourceLocation.fromNamespaceAndPath("minecraft", "textures/block/calcite.png"), FrameType.TASK, true, false, true)) .parent(root) .addCriterion("has_creative_unlocker", InventoryChangeTrigger.TriggerInstance.hasItems( diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java index 2ba8629a35..f95a93724f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java @@ -512,7 +512,7 @@ public void buildRecipes(Consumer recipes) { .withOutput(HexItems.AMETHYST_DUST, 5) .withOutput(0.25f, HexItems.CHARGED_AMETHYST)) .whenModLoaded("create") - .save(recipes, new ResourceLocation("create", "crushing/amethyst_cluster")); + .save(recipes, ResourceLocation.fromNamespaceAndPath("create", "crushing/amethyst_cluster")); this.conditions.apply(new CreateCrushingRecipeBuilder() .withInput(Blocks.AMETHYST_BLOCK) @@ -520,7 +520,7 @@ public void buildRecipes(Consumer recipes) { .withOutput(Items.AMETHYST_SHARD, 3) .withOutput(0.5f, HexItems.AMETHYST_DUST, 4)) .whenModLoaded("create") - .save(recipes, new ResourceLocation("create", "crushing/amethyst_block")); + .save(recipes, ResourceLocation.fromNamespaceAndPath("create", "crushing/amethyst_block")); this.conditions.apply(new CreateCrushingRecipeBuilder() .withInput(Items.AMETHYST_SHARD) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/BrainsweepRecipeBuilder.java b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/BrainsweepRecipeBuilder.java index 09465dfd03..55801b92aa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/BrainsweepRecipeBuilder.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/builders/BrainsweepRecipeBuilder.java @@ -59,7 +59,7 @@ public void save(Consumer pFinishedRecipeConsumer, ResourceLocat throw new IllegalStateException("No way of obtaining recipe " + pRecipeId); } - this.advancement.parent(new ResourceLocation("recipes/root")) + this.advancement.parent(ResourceLocation.fromNamespaceAndPath("minecraft", "recipes/root")) .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(pRecipeId)) .rewards(AdvancementRewards.Builder.recipe(pRecipeId)) .requirements(RequirementsStrategy.OR); @@ -67,7 +67,7 @@ public void save(Consumer pFinishedRecipeConsumer, ResourceLocat pRecipeId, this.blockIn, this.entityIn, this.mediaCost, this.result, this.advancement, - new ResourceLocation(pRecipeId.getNamespace(), "recipes/brainsweep/" + pRecipeId.getPath()))); + ResourceLocation.fromNamespaceAndPath(pRecipeId.getNamespace(), "recipes/brainsweep/" + pRecipeId.getPath()))); } public record Result(ResourceLocation id, StateIngredient blockIn, BrainsweepeeIngredient villagerIn, @@ -75,6 +75,7 @@ public record Result(ResourceLocation id, StateIngredient blockIn, BrainsweepeeI ResourceLocation advancementId) implements FinishedRecipe { @Override public void serializeRecipeData(JsonObject json) { + json.addProperty("id", this.id.toString()); json.add("blockIn", this.blockIn.serialize()); json.add("entityIn", this.villagerIn.serialize()); json.addProperty("cost", this.mediaCost); diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java index 4b083c5731..e3ef8bc1a1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java @@ -43,7 +43,7 @@ private static TagKey ersatzActionTag(TagKeycreateRegistryKey( - new ResourceLocation("foobar", "hexcasting/tags/action")); + ResourceLocation.fromNamespaceAndPath("foobar", "hexcasting/tags/action")); return TagKey.create(fakeKey, real.location()); } else { return real; diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexBlockTagProvider.java b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexBlockTagProvider.java index 5f99c7f229..073cf5bcff 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexBlockTagProvider.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexBlockTagProvider.java @@ -141,7 +141,7 @@ protected void addTags(HolderLookup.Provider provider) { HexBlocks.QUENCHED_ALLAY, HexBlocks.QUENCHED_ALLAY_BRICKS, HexBlocks.QUENCHED_ALLAY_BRICKS_SMALL, HexBlocks.QUENCHED_ALLAY_TILES); // this is a hack but fixes #532 - var createBrittle = TagKey.create(Registries.BLOCK, new ResourceLocation("create", "brittle")); + var createBrittle = TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath("create", "brittle")); tag(createBrittle).addOptionalTag(BuiltInRegistries.BLOCK.getKey(HexBlocks.SLATE)); } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java b/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java index 6ecbc2d40f..2201f2e7d6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java @@ -1,7 +1,5 @@ package at.petrak.hexcasting.interop; -import at.petrak.hexcasting.interop.inline.InlineHex; -import at.petrak.hexcasting.interop.inline.InlineHexClient; import at.petrak.hexcasting.interop.pehkui.PehkuiInterop; import at.petrak.hexcasting.xplat.IClientXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatAbstractions; @@ -23,6 +21,8 @@ public static final class Fabric { public static final String TRINKETS_API_ID = "trinkets"; } + public static final String INLINE_ID = "inline"; + public static void init() { initPatchouli(); @@ -33,12 +33,26 @@ public static void init() { xplat.initPlatformSpecific(); - InlineHex.init(); + if (xplat.isModPresent(INLINE_ID)) { + try { + Class.forName("at.petrak.hexcasting.interop.inline.InlineHex") + .getMethod("init").invoke(null); + } catch (Exception ignored) { + // Inline classes excluded from build or mod not loaded + } + } } public static void clientInit() { IClientXplatAbstractions.INSTANCE.initPlatformSpecific(); - InlineHexClient.init(); + if (IXplatAbstractions.INSTANCE.isModPresent(INLINE_ID)) { + try { + Class.forName("at.petrak.hexcasting.interop.inline.InlineHexClient") + .getMethod("init").invoke(null); + } catch (Exception ignored) { + // Inline classes excluded from build or mod not loaded + } + } } private static void initPatchouli() { @@ -72,8 +86,7 @@ private static void initPatchouli() { } } - if (anyInterop) { - PatchouliAPI.get().setConfigFlag(PATCHOULI_ANY_INTEROP_FLAG, true); - } + // Always register the flag so Patchouli doesn't warn "Queried for unknown config flag" + PatchouliAPI.get().setConfigFlag(PATCHOULI_ANY_INTEROP_FLAG, anyInterop); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/inline/InlinePatternData.java b/Common/src/main/java/at/petrak/hexcasting/interop/inline/InlinePatternData.java index 5dc2dba2ff..d07b94c01b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/inline/InlinePatternData.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/inline/InlinePatternData.java @@ -11,6 +11,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; @@ -42,7 +43,7 @@ public ResourceLocation getRendererId(){ public Style getExtraStyle() { ItemStack scrollStack = new ItemStack(HexItems.SCROLL_MEDIUM); HexItems.SCROLL_MEDIUM.writeDatum(scrollStack, new PatternIota(pattern)); - scrollStack.setHoverName(getPatternName(pattern).copy().withStyle(ChatFormatting.WHITE)); + scrollStack.set(DataComponents.CUSTOM_NAME, getPatternName(pattern).copy().withStyle(ChatFormatting.WHITE)); HoverEvent he = new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(scrollStack)); ClickEvent ce = new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, pattern.toString()); return Style.EMPTY.withHoverEvent(he).withClickEvent(ce); @@ -70,7 +71,7 @@ public Component asText(boolean withExtra) { } public static class InlinePatternDataType implements InlineDataType { - private static final ResourceLocation ID = new ResourceLocation(HexAPI.MOD_ID, "pattern"); + private static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(HexAPI.MOD_ID, "pattern"); public static final InlinePatternDataType INSTANCE = new InlinePatternDataType(); @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/AbstractPatternComponent.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/AbstractPatternComponent.java index 997bb09411..7f850026ee 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/AbstractPatternComponent.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/AbstractPatternComponent.java @@ -5,6 +5,7 @@ import at.petrak.hexcasting.client.render.PatternRenderer; import at.petrak.hexcasting.client.render.PatternSettings; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.core.HolderLookup; import net.minecraft.client.gui.GuiGraphics; import vazkii.patchouli.api.IComponentRenderContext; import vazkii.patchouli.api.ICustomComponent; @@ -31,7 +32,7 @@ public void build(int x, int y, int pagenum) { this.y = y == -1 ? 70 : y; } - public abstract List getPatterns(UnaryOperator lookup); + public abstract List getPatterns(UnaryOperator lookup, HolderLookup.Provider registries); public abstract boolean showStrokeOrder(); @@ -77,11 +78,10 @@ public void render(GuiGraphics graphics, IComponentRenderContext context, float } @Override - public void onVariablesAvailable(UnaryOperator lookup) { - this.patterns = this.getPatterns(lookup); + public void onVariablesAvailable(UnaryOperator lookup, HolderLookup.Provider registries) { + this.patterns = this.getPatterns(lookup, registries); } - // used for deserialization from patchi protected static class RawPattern { protected String startdir; protected String signature; diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/BrainsweepProcessor.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/BrainsweepProcessor.java index 576e82bb42..d8901df595 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/BrainsweepProcessor.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/BrainsweepProcessor.java @@ -6,7 +6,6 @@ import at.petrak.hexcasting.common.recipe.HexRecipeStuffRegistry; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -26,13 +25,13 @@ public class BrainsweepProcessor implements IComponentProcessor { @Override public void setup(Level level, IVariableProvider vars) { - var id = new ResourceLocation(vars.get("recipe").asString()); + var id = ResourceLocation.parse(vars.get("recipe", level.registryAccess()).asString()); var recman = level.getRecipeManager(); var brainsweepings = recman.getAllRecipesFor(HexRecipeStuffRegistry.BRAINSWEEP_TYPE); - for (var poisonApples : brainsweepings) { - if (poisonApples.getId().equals(id)) { - this.recipe = poisonApples; + for (var holder : brainsweepings) { + if (holder.id().equals(id)) { + this.recipe = holder.value(); break; } } @@ -40,47 +39,50 @@ public void setup(Level level, IVariableProvider vars) { @Override public IVariable process(Level level, String key) { + var provider = level.registryAccess(); + // Always provide entity fallback so Patchouli never gets empty string (causes "Unknown entity id") + if ("entity".equals(key)) { + if (this.recipe != null && this.exampleEntityString == null) { + try { + var clientLevel = Minecraft.getInstance().level; + var entity = clientLevel != null + ? this.recipe.entityIn().exampleEntity(clientLevel) + : null; + if (entity != null) { + this.exampleEntityString = BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()).toString(); + } + } catch (Exception ignored) { + // Fall through + } + if (this.exampleEntityString == null) { + this.exampleEntityString = "minecraft:villager"; + } + } + return IVariable.wrap(this.exampleEntityString != null ? this.exampleEntityString : "minecraft:villager", provider); + } if (this.recipe == null) { return null; } switch (key) { case "header" -> { - return IVariable.from(this.recipe.result().getBlock().getName()); + return IVariable.from(this.recipe.result().getBlock().getName(), provider); } case "input" -> { var inputStacks = this.recipe.blockIn().getDisplayedStacks(); - return IVariable.from(inputStacks.toArray(new ItemStack[0])); + return IVariable.from(inputStacks.toArray(new ItemStack[0]), provider); } case "result" -> { - return IVariable.from(new ItemStack(this.recipe.result().getBlock())); + return IVariable.from(new ItemStack(this.recipe.result().getBlock()), provider); } - case "entity" -> { - if (this.exampleEntityString == null) { - var entity = this.recipe.entityIn().exampleEntity(Minecraft.getInstance().level); - if (entity == null) { - // oh dear - return null; - } - var bob = new StringBuilder(); - bob.append(BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType())); - - var tag = new CompoundTag(); - entity.save(tag); - bob.append(tag.toString()); - this.exampleEntityString = bob.toString(); - } - - return IVariable.wrap(this.exampleEntityString); - } case "entityTooltip" -> { Minecraft mc = Minecraft.getInstance(); return IVariable.wrapList(this.recipe.entityIn() .getTooltip(mc.options.advancedItemTooltips) .stream() - .map(IVariable::from) - .toList()); + .map(c -> IVariable.from(c, provider)) + .toList(), provider); } case "mediaCost" -> { record ItemCost(Item item, int cost) { @@ -94,18 +96,17 @@ public boolean dividesEvenly (int dividend) { new ItemCost(HexItems.CHARGED_AMETHYST, (int)MediaConstants.CRYSTAL_UNIT), }; - // get evenly divisible ItemStacks List validItemStacks = Arrays.stream(costs) .filter(itemCost -> itemCost.dividesEvenly((int)this.recipe.mediaCost())) .map(validItemCost -> new ItemStack(validItemCost.item, (int) this.recipe.mediaCost() / validItemCost.cost)) - .map(IVariable::from) + .map(stack -> IVariable.from(stack, provider)) .toList(); if (!validItemStacks.isEmpty()) { - return IVariable.wrapList(validItemStacks); + return IVariable.wrapList(validItemStacks, provider); } // fallback: display in terms of dust - return IVariable.from(new ItemStack(HexItems.AMETHYST_DUST, (int) (this.recipe.mediaCost() / MediaConstants.DUST_UNIT))); + return IVariable.from(new ItemStack(HexItems.AMETHYST_DUST, (int) (this.recipe.mediaCost() / MediaConstants.DUST_UNIT)), provider); } default -> { return null; diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/CustomComponentTooltip.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/CustomComponentTooltip.java index 13972ce372..8d70329df9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/CustomComponentTooltip.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/CustomComponentTooltip.java @@ -2,6 +2,7 @@ import com.google.gson.annotations.SerializedName; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.core.HolderLookup; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import vazkii.patchouli.api.IComponentRenderContext; @@ -20,15 +21,22 @@ public class CustomComponentTooltip implements ICustomComponent { transient IVariable tooltipVar; transient List tooltip; + transient HolderLookup.Provider registries; transient int x, y; + @Override + public void onVariablesAvailable(UnaryOperator lookup, HolderLookup.Provider registries) { + this.registries = registries; + tooltipVar = lookup.apply(tooltipReference); + } + @Override public void build(int componentX, int componentY, int pageNum) { x = componentX; y = componentY; tooltip = new ArrayList<>(); - for (IVariable s : tooltipVar.asListOrSingleton()) { + for (IVariable s : tooltipVar.asListOrSingleton(registries)) { tooltip.add(s.as(Component.class)); } } @@ -40,8 +48,4 @@ public void render(GuiGraphics graphics, IComponentRenderContext context, float } } - @Override - public void onVariablesAvailable(UnaryOperator lookup) { - tooltipVar = lookup.apply(tooltipReference); - } } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/LookupPatternComponent.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/LookupPatternComponent.java index 632c7abf79..45965d42f4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/LookupPatternComponent.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/LookupPatternComponent.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.xplat.IXplatAbstractions; import com.google.gson.annotations.SerializedName; +import net.minecraft.core.HolderLookup; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import vazkii.patchouli.api.IVariable; @@ -22,7 +23,7 @@ public class LookupPatternComponent extends AbstractPatternComponent { protected boolean strokeOrder; @Override - public List getPatterns(UnaryOperator lookup) { + public List getPatterns(UnaryOperator lookup, HolderLookup.Provider registries) { var key = ResourceKey.create(IXplatAbstractions.INSTANCE.getActionRegistry().key(), this.opName); var entry = IXplatAbstractions.INSTANCE.getActionRegistry().get(key); @@ -37,10 +38,10 @@ public boolean showStrokeOrder() { } @Override - public void onVariablesAvailable(UnaryOperator lookup) { - var opName = lookup.apply(IVariable.wrap(this.opNameRaw)).asString(); + public void onVariablesAvailable(UnaryOperator lookup, HolderLookup.Provider registries) { + var opName = lookup.apply(IVariable.wrap(this.opNameRaw, registries)).asString(); this.opName = ResourceLocation.tryParse(opName); - super.onVariablesAvailable(lookup); + super.onVariablesAvailable(lookup, registries); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/ManualPatternComponent.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/ManualPatternComponent.java index f737701fc7..15ffcd5c3c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/ManualPatternComponent.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/ManualPatternComponent.java @@ -5,6 +5,7 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; +import net.minecraft.core.HolderLookup; import vazkii.patchouli.api.IVariable; import java.util.ArrayList; @@ -23,9 +24,9 @@ public class ManualPatternComponent extends AbstractPatternComponent { protected transient boolean strokeOrder; @Override - public List getPatterns(UnaryOperator lookup) { - this.strokeOrder = lookup.apply(IVariable.wrap(this.strokeOrderRaw)).asBoolean(true); - var patsRaw = lookup.apply(IVariable.wrap(patternsRaw)).asListOrSingleton(); + public List getPatterns(UnaryOperator lookup, HolderLookup.Provider registries) { + this.strokeOrder = lookup.apply(IVariable.wrap(this.strokeOrderRaw, registries)).asBoolean(true); + var patsRaw = lookup.apply(IVariable.wrap(patternsRaw, registries)).asListOrSingleton(registries); var out = new ArrayList(); for (var ivar : patsRaw) { @@ -46,9 +47,9 @@ public boolean showStrokeOrder() { } @Override - public void onVariablesAvailable(UnaryOperator lookup) { - this.strokeOrder = IVariable.wrap(this.strokeOrderRaw).asBoolean(true); + public void onVariablesAvailable(UnaryOperator lookup, HolderLookup.Provider registries) { + this.strokeOrder = IVariable.wrap(this.strokeOrderRaw, registries).asBoolean(true); - super.onVariablesAvailable(lookup); + super.onVariablesAvailable(lookup, registries); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/MultiCraftingProcessor.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/MultiCraftingProcessor.java index 055128b7a5..39b8bb3bfd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/MultiCraftingProcessor.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/MultiCraftingProcessor.java @@ -32,10 +32,11 @@ public class MultiCraftingProcessor implements IComponentProcessor { @Override public void setup(Level level, IVariableProvider vars) { - List names = vars.get("recipes").asStream().map(IVariable::asString).collect(Collectors.toList()); + var provider = level.registryAccess(); + List names = vars.get("recipes", provider).asStream(provider).map(IVariable::asString).collect(Collectors.toList()); this.recipes = new ArrayList<>(); for (String name : names) { - CraftingRecipe recipe = PatchouliUtils.getRecipe(RecipeType.CRAFTING, new ResourceLocation(name)); + CraftingRecipe recipe = PatchouliUtils.getRecipe(RecipeType.CRAFTING, ResourceLocation.parse(name)); if (recipe != null) { recipes.add(recipe); if (shapeless) { @@ -59,9 +60,10 @@ public IVariable process(Level level, String key) { if (recipes.isEmpty()) { return null; } + var provider = level.registryAccess(); if (key.equals("heading")) { if (!hasCustomHeading) { - return IVariable.from(recipes.get(0).getResultItem(level.registryAccess()).getHoverName()); + return IVariable.from(recipes.get(0).getResultItem(provider).getHoverName(), provider); } return null; } @@ -85,14 +87,15 @@ public IVariable process(Level level, String key) { ingredients.add(list.size() > index ? list.get(index) : Ingredient.EMPTY); } } - return PatchouliUtils.interweaveIngredients(ingredients, longestIngredientSize); + return PatchouliUtils.interweaveIngredients(ingredients, longestIngredientSize, provider); } if (key.equals("output")) { return IVariable.wrapList( - recipes.stream().map(recipe -> recipe.getResultItem(level.registryAccess())).map(IVariable::from).collect(Collectors.toList())); + recipes.stream().map(recipe -> recipe.getResultItem(provider)).map(stack -> IVariable.from(stack, provider)).collect(Collectors.toList()), + provider); } if (key.equals("shapeless")) { - return IVariable.wrap(shapeless); + return IVariable.wrap(shapeless, provider); } return null; } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatchouliUtils.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatchouliUtils.java index 574b296e1b..23811f169c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatchouliUtils.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatchouliUtils.java @@ -1,8 +1,8 @@ package at.petrak.hexcasting.interop.patchouli; import net.minecraft.client.Minecraft; +import net.minecraft.core.HolderLookup; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; @@ -22,14 +22,16 @@ */ public class PatchouliUtils { @SuppressWarnings("unchecked") - public static , C extends Container> T getRecipe(RecipeType type, ResourceLocation id) { + public static > T getRecipe(RecipeType type, ResourceLocation id) { // PageDoubleRecipeRegistry if (Minecraft.getInstance().level == null) { return null; } else { var manager = Minecraft.getInstance().level.getRecipeManager(); return (T) manager.byKey(id) - .filter((recipe) -> recipe.getType() == type).orElse(null); + .filter((holder) -> holder.value().getType() == type) + .map(h -> (T) h.value()) + .orElse(null); } } @@ -40,12 +42,13 @@ public static , C extends Container> T getRecipe(RecipeType< * * @param ingredients List of ingredients in the specific slot * @param longestIngredientSize Longest ingredient in the entire recipe + * @param registries HolderLookup.Provider for serialization * @return Serialized Patchouli ingredient string */ - public static IVariable interweaveIngredients(List ingredients, int longestIngredientSize) { + public static IVariable interweaveIngredients(List ingredients, int longestIngredientSize, HolderLookup.Provider registries) { if (ingredients.size() == 1) { - return IVariable.wrapList(Arrays.stream(ingredients.get(0).getItems()).map(IVariable::from).collect( - Collectors.toList())); + return IVariable.wrapList(Arrays.stream(ingredients.get(0).getItems()).map(s -> IVariable.from(s, registries)).collect( + Collectors.toList()), registries); } ItemStack[] empty = {ItemStack.EMPTY}; @@ -60,17 +63,17 @@ public static IVariable interweaveIngredients(List ingredients, int List list = new ArrayList<>(stacks.size() * longestIngredientSize); for (int i = 0; i < longestIngredientSize; i++) { for (ItemStack[] stack : stacks) { - list.add(IVariable.from(stack[i % stack.length])); + list.add(IVariable.from(stack[i % stack.length], registries)); } } - return IVariable.wrapList(list); + return IVariable.wrapList(list, registries); } /** * Overload of the method above that uses the provided list's longest ingredient size. */ - public static IVariable interweaveIngredients(List ingredients) { + public static IVariable interweaveIngredients(List ingredients, HolderLookup.Provider registries) { return interweaveIngredients(ingredients, - ingredients.stream().mapToInt(ingr -> ingr.getItems().length).max().orElse(1)); + ingredients.stream().mapToInt(ingr -> ingr.getItems().length).max().orElse(1), registries); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatternProcessor.java b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatternProcessor.java index 94e9e258b8..a46f9a5e9a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatternProcessor.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/patchouli/PatternProcessor.java @@ -11,10 +11,11 @@ public class PatternProcessor implements IComponentProcessor { @Override public void setup(Level level, IVariableProvider vars) { + var provider = level.registryAccess(); if (vars.has("header")) - translationKey = vars.get("header").asString(); + translationKey = vars.get("header", provider).asString(); else { - IVariable key = vars.get("op_id"); + IVariable key = vars.get("op_id", provider); String opName = key.asString(); String prefix = "hexcasting.action."; @@ -26,7 +27,7 @@ public void setup(Level level, IVariableProvider vars) { @Override public IVariable process(Level level, String key) { if (key.equals("translation_key")) { - return IVariable.wrap(translationKey); + return IVariable.wrap(translationKey, level.registryAccess()); } return null; diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinAbstractVillager.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinAbstractVillager.java index 344e60efcb..1d6db70287 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinAbstractVillager.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinAbstractVillager.java @@ -11,7 +11,7 @@ // Prevents the villager from having any offers if it's brainswept @Mixin(AbstractVillager.class) public class MixinAbstractVillager { - @Inject(method = "getOffers", at = @At("HEAD"), cancellable = true) + @Inject(method = "getOffers", at = @At("HEAD"), cancellable = true, remap = false) private void nixOffers(CallbackInfoReturnable cir) { var self = (AbstractVillager) (Object) this; if (IXplatAbstractions.INSTANCE.isBrainswept(self)) { diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index c3dbc47b81..daf0ec4bc0 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java @@ -12,7 +12,7 @@ // Nuke the brain at the source @Mixin(LivingEntity.class) public abstract class MixinLivingEntity { - @Inject(method = "getBrain", at = @At("RETURN")) + @Inject(method = "getBrain", at = @At("RETURN"), remap = false) private void removeBrain(CallbackInfoReturnable> cir) { var self = (LivingEntity) (Object) this; if (self instanceof Mob mob && IXplatAbstractions.INSTANCE.isBrainswept(mob)) { diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinMob.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinMob.java index 9404606e8c..3512879f6c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinMob.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinMob.java @@ -10,7 +10,7 @@ // Prevents brainswept mobs from having an AI tick @Mixin(Mob.class) public class MixinMob { - @Inject(method = "serverAiStep", at = @At("HEAD"), cancellable = true) + @Inject(method = "serverAiStep", at = @At("HEAD"), cancellable = true, remap = false) private void onRegisterBrainGoals(CallbackInfo ci) { var self = (Mob) (Object) this; if (IXplatAbstractions.INSTANCE.isBrainswept(self)) { @@ -18,7 +18,7 @@ private void onRegisterBrainGoals(CallbackInfo ci) { } } - @Inject(method = "playAmbientSound", at = @At("HEAD"), cancellable = true) + @Inject(method = "playAmbientSound", at = @At("HEAD"), cancellable = true, remap = false) protected void onPlayAmbientSound(CallbackInfo ci) { var self = (Mob) (Object) this; if (IXplatAbstractions.INSTANCE.isBrainswept(self)) { diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinRaider.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinRaider.java index cb1d92eda8..2bf3b308a9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinRaider.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinRaider.java @@ -9,8 +9,7 @@ // Prevents the witch from joining a raid @Mixin(Raider.class) public class MixinRaider { - @Redirect(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/raid/Raider;isAlive" + - "()Z")) + @Redirect(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;isAlive()Z"), remap = false) private boolean isAliveForAiPurposes(Raider instance) { var self = (Raider) (Object) this; return self.isAlive() && !IXplatAbstractions.INSTANCE.isBrainswept(self); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinVillager.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinVillager.java index 4f577f7246..fed6fc1d36 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinVillager.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinVillager.java @@ -11,7 +11,7 @@ // Prevents the villager from any of its brain goals @Mixin(Villager.class) public class MixinVillager { - @Inject(method = "canBreed", at = @At("HEAD"), cancellable = true) + @Inject(method = "canBreed", at = @At("HEAD"), cancellable = true, remap = false) private void preventBreeding(CallbackInfoReturnable cir) { var self = (Villager) (Object) this; if (IXplatAbstractions.INSTANCE.isBrainswept(self)) { @@ -19,7 +19,7 @@ private void preventBreeding(CallbackInfoReturnable cir) { } } - @Inject(method = "setUnhappy", at = @At("HEAD"), cancellable = true) + @Inject(method = "setUnhappy", at = @At("HEAD"), cancellable = true, remap = false) private void preventUnhappiness(CallbackInfo ci) { var self = (Villager) (Object) this; if (IXplatAbstractions.INSTANCE.isBrainswept(self)) { diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java index 6ccfa837fc..83b7630852 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java @@ -3,6 +3,7 @@ import net.minecraft.world.entity.npc.WanderingTrader; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraft.world.item.trading.ItemCost; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.util.RandomSource; @@ -20,7 +21,7 @@ // Adds ancient scrolls to the wandering trader by replacing the special trade in the last slot @Mixin(WanderingTrader.class) public class MixinWanderingTrader { - @Inject(method = "updateTrades", at = @At("RETURN")) + @Inject(method = "updateTrades", at = @At("RETURN"), remap = false) private void addNewTrades(CallbackInfo ci) { var self = (WanderingTrader) (Object) this; MerchantOffers offerList = self.getOffers(); @@ -31,7 +32,7 @@ private void addNewTrades(CallbackInfo ci) { ItemStack scroll = new ItemStack(HexItems.SCROLL_LARGE); AddPerWorldPatternToScrollFunc.doStatic(scroll, rand, self.getServer().overworld()); NBTHelper.putBoolean(scroll, ItemScroll.TAG_NEEDS_PURCHASE, true); - offerList.set(5, new MerchantOffer(new ItemStack(Items.EMERALD, 12), scroll, 1, 1, 1)); + offerList.set(5, new MerchantOffer(new ItemCost(Items.EMERALD, 12), scroll, 1, 1, 1.0F)); } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWitch.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWitch.java index fe23cebeb8..0b2fd31faa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWitch.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWitch.java @@ -9,8 +9,7 @@ // Prevents the witch from drinking potions @Mixin(Witch.class) public class MixinWitch { - @Redirect(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Witch;" + - "isAlive()Z")) + @Redirect(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;isAlive()Z"), remap = false) private boolean isAliveForAiPurposes(Witch instance) { var self = (Witch) (Object) this; return self.isAlive() && !IXplatAbstractions.INSTANCE.isBrainswept(self); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorAbstractArrow.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorAbstractArrow.java index b956033d3b..3bbcc1ea4a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorAbstractArrow.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorAbstractArrow.java @@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(AbstractArrow.class) +@Mixin(value = AbstractArrow.class, remap = false) public interface AccessorAbstractArrow { @Accessor("inGround") boolean hex$isInGround(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorEntity.java index 691669853b..14e9618de7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorEntity.java @@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(Entity.class) +@Mixin(value = Entity.class, remap = false) public interface AccessorEntity { @Invoker("markHurt") void hex$markHurt(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLivingEntity.java index fde107fc87..873efb39ca 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLivingEntity.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(LivingEntity.class) +@Mixin(value = LivingEntity.class, remap = false) public interface AccessorLivingEntity { @Accessor("lastHurt") float hex$getLastHurt(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLootTable.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLootTable.java index d2be3c734d..e3ba72cbfc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLootTable.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorLootTable.java @@ -8,16 +8,17 @@ import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; +import java.util.List; import java.util.function.BiFunction; -@Mixin(LootTable.class) +@Mixin(value = LootTable.class, remap = false) public interface AccessorLootTable { @Accessor("functions") - LootItemFunction[] hex$getFunctions(); + List hex$getFunctions(); @Accessor("functions") @Mutable - void hex$setFunctions(LootItemFunction[] lifs); + void hex$setFunctions(List lifs); @Accessor("compositeFunction") @Mutable diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorPotionBrewing.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorPotionBrewing.java deleted file mode 100644 index 88fe176a12..0000000000 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorPotionBrewing.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.petrak.hexcasting.mixin.accessor; - -import net.minecraft.world.item.Item; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionBrewing; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(PotionBrewing.class) -public interface AccessorPotionBrewing { - @Invoker("addMix") - static void addMix(Potion p_43514_, Item p_43515_, Potion p_43516_) { - } -} diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorUseOnContext.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorUseOnContext.java index 1cf59b94a9..9d7af61aa0 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorUseOnContext.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorUseOnContext.java @@ -11,7 +11,7 @@ import javax.annotation.Nullable; -@Mixin(UseOnContext.class) +@Mixin(value = UseOnContext.class, remap = false) public interface AccessorUseOnContext { @Invoker("") static UseOnContext hex$new(Level $$0, @Nullable Player $$1, InteractionHand $$2, ItemStack $$3, diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorVillager.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorVillager.java index dc03602412..7b2f04b348 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorVillager.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/AccessorVillager.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(Villager.class) +@Mixin(value = Villager.class, remap = false) public interface AccessorVillager { @Invoker("tellWitnessesThatIWasMurdered") void hex$tellWitnessesThatIWasMurdered(Entity murderer); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/CriteriaTriggersAccessor.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/CriteriaTriggersAccessor.java index 5aaf071208..6c21b9941c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/CriteriaTriggersAccessor.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/CriteriaTriggersAccessor.java @@ -5,10 +5,10 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(CriteriaTriggers.class) +@Mixin(value = CriteriaTriggers.class, remap = false) public interface CriteriaTriggersAccessor { @Invoker("register") - static > T hex$register(T trigger) { + static > T hex$register(String id, T trigger) { throw new UnsupportedOperationException(); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorBlockEntityRenderDispatcher.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorBlockEntityRenderDispatcher.java index 52294d04f6..d31345cc8d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorBlockEntityRenderDispatcher.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorBlockEntityRenderDispatcher.java @@ -7,7 +7,7 @@ import java.util.function.Supplier; -@Mixin(BlockEntityRenderDispatcher.class) +@Mixin(value = BlockEntityRenderDispatcher.class, remap = false) public interface AccessorBlockEntityRenderDispatcher { @Accessor("blockRenderDispatcher") Supplier hex$getBlockRenderDispatcher(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorCompositeRenderType.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorCompositeRenderType.java index c7965fd588..51750e6525 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorCompositeRenderType.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorCompositeRenderType.java @@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(RenderType.CompositeRenderType.class) +@Mixin(value = RenderType.CompositeRenderType.class, remap = false) public interface AccessorCompositeRenderType { @Invoker("state") RenderType.CompositeState hex$state(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorEmptyTextureStateShard.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorEmptyTextureStateShard.java index 2ee90b1593..e58ba23dbf 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorEmptyTextureStateShard.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorEmptyTextureStateShard.java @@ -7,7 +7,7 @@ import java.util.Optional; -@Mixin(RenderStateShard.EmptyTextureStateShard.class) +@Mixin(value = RenderStateShard.EmptyTextureStateShard.class, remap = false) public interface AccessorEmptyTextureStateShard { @Invoker("cutoutTexture") Optional hex$cutoutTexture(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorMouseHandler.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorMouseHandler.java index 54343bb81c..26498e6fec 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorMouseHandler.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorMouseHandler.java @@ -4,11 +4,11 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(MouseHandler.class) +@Mixin(value = MouseHandler.class, remap = false) public interface AccessorMouseHandler { - @Accessor("accumulatedScroll") + @Accessor("accumulatedScrollY") double hex$getAccumulatedScroll(); - @Accessor("accumulatedScroll") + @Accessor("accumulatedScrollY") void hex$setAccumulatedScroll(double scroll); } diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderStateShard.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderStateShard.java index 653ce5fb62..0bfc444e79 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderStateShard.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderStateShard.java @@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(RenderStateShard.class) +@Mixin(value = RenderStateShard.class, remap = false) public interface AccessorRenderStateShard { @Accessor("name") String hex$name(); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderType.java b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderType.java index 5908725e0a..97b3954961 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderType.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/accessor/client/AccessorRenderType.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.gen.Invoker; // https://github.com/VazkiiMods/Botania/blob/13b7bcd9cbb6b1a418b0afe455662d29b46f1a7f/Xplat/src/main/java/vazkii/botania/mixin/client/AccessorRenderType.java -@Mixin(RenderType.class) +@Mixin(value = RenderType.class, remap = false) public interface AccessorRenderType { @Invoker("create") static RenderType.CompositeRenderType hex$create(String string, VertexFormat vertexFormat, diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinClientLevel.java b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinClientLevel.java index 240232f2d4..44d334c284 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinClientLevel.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinClientLevel.java @@ -21,6 +21,7 @@ public abstract class MixinClientLevel { @Inject(method = "doAnimateTick", + remap = false, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/Block;animateTick" + "(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;" + "Lnet/minecraft/core/BlockPos;Lnet/minecraft/util/RandomSource;)V"), diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinPlayerRenderer.java b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinPlayerRenderer.java index eb46c8522d..b1a820f531 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinPlayerRenderer.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinPlayerRenderer.java @@ -13,6 +13,7 @@ @Mixin(PlayerRenderer.class) public abstract class MixinPlayerRenderer { @Inject(method = "render(Lnet/minecraft/client/player/AbstractClientPlayer;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", + remap = false, at = @At("HEAD")) public void hex$onRender(AbstractClientPlayer player, float $$1, float pticks, PoseStack ps, MultiBufferSource bufferSource, int $$5, CallbackInfo ci) { ClientRenderHelper.renderCastingStack(ps, player, pticks); diff --git a/Common/src/main/java/at/petrak/hexcasting/server/ScrungledPatternsSave.java b/Common/src/main/java/at/petrak/hexcasting/server/ScrungledPatternsSave.java index 2407d3571a..8ee5873d91 100644 --- a/Common/src/main/java/at/petrak/hexcasting/server/ScrungledPatternsSave.java +++ b/Common/src/main/java/at/petrak/hexcasting/server/ScrungledPatternsSave.java @@ -7,8 +7,10 @@ import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.xplat.IXplatAbstractions; import com.mojang.datafixers.util.Pair; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; +import net.minecraft.util.datafix.DataFixTypes; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.saveddata.SavedData; @@ -61,7 +63,7 @@ public Pair lookupReverse(ResourceKey { var inner = new CompoundTag(); @@ -72,7 +74,7 @@ public CompoundTag save(CompoundTag tag) { return tag; } - private static ScrungledPatternsSave load(CompoundTag tag) { + private static ScrungledPatternsSave load(CompoundTag tag, HolderLookup.Provider registries) { var registryKey = IXplatAbstractions.INSTANCE.getActionRegistry().key(); var map = new HashMap(); @@ -83,7 +85,7 @@ private static ScrungledPatternsSave load(CompoundTag tag) { var rawKey = inner.getString(TAG_KEY); var dir = HexDir.values()[rawDir]; - var key = ResourceKey.create(registryKey, new ResourceLocation(rawKey)); + var key = ResourceKey.create(registryKey, ResourceLocation.parse(rawKey)); map.put(sig, new PerWorldEntry(key, dir)); } @@ -116,8 +118,10 @@ public static ScrungledPatternsSave createFromScratch(long seed) { public static ScrungledPatternsSave open(ServerLevel overworld) { return overworld.getDataStorage().computeIfAbsent( - ScrungledPatternsSave::load, - () -> ScrungledPatternsSave.createFromScratch(overworld.getSeed()), + new SavedData.Factory<>( + () -> ScrungledPatternsSave.createFromScratch(overworld.getSeed()), + ScrungledPatternsSave::load, + DataFixTypes.LEVEL), TAG_SAVED_DATA); } diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json index 98b2fca094..3624479195 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/ancient_cyphers.json @@ -12,7 +12,7 @@ { "type": "patchouli:spotlight", "text": "hexcasting.page.ancient_cyphers.2", - "item": "hexcasting:ancient_cypher{variant:0},hexcasting:ancient_cypher{variant:1},hexcasting:ancient_cypher{variant:2},hexcasting:ancient_cypher{variant:3},hexcasting:ancient_cypher{variant:4},hexcasting:ancient_cypher{variant:5},hexcasting:ancient_cypher{variant:6},hexcasting:ancient_cypher{variant:7}" + "item": "hexcasting:ancient_cypher" }, { "type": "patchouli:crafting", diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/creative_items.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/creative_items.json index 31ba2000c5..16ba82c2fb 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/creative_items.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/creative_items.json @@ -24,7 +24,7 @@ "type": "patchouli:spotlight", "title": "hexcasting.page.creative_items.debug_media.title", "text": "hexcasting.page.creative_items.debug_media.desc", - "item": "hexcasting:creative_unlocker{display:{Name:'{\\\"text\\\":\\\"debug media\\\"}'}}" + "item": "hexcasting:creative_unlocker" } ] } \ No newline at end of file diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/hexcasting.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/hexcasting.json index b28262d6b8..03e8990b3a 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/hexcasting.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/hexcasting.json @@ -1,7 +1,7 @@ { "name": "hexcasting.entry.hexcasting", "category": "hexcasting:items", - "icon": "hexcasting:artifact{patterns:[]}", + "icon": "hexcasting:artifact", "sortnum": 6, "advancement": "hexcasting:root", "pages": [ diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/phials.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/phials.json index 0f930d1ec8..c49fc9cdea 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/phials.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/phials.json @@ -21,7 +21,7 @@ { "type": "patchouli:spotlight", "text": "hexcasting.page.phials.desc", - "item": "hexcasting:battery{\"hexcasting:media\":640000,\"hexcasting:start_media\":640000}", + "item": "hexcasting:battery", "link_recipe": true } ] diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/potions.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/potions.json index a0db5dd70b..0a4ed16c7d 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/potions.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/items/potions.json @@ -1,7 +1,7 @@ { "name": "hexcasting.entry.potions", "category": "hexcasting:items", - "icon": "minecraft:potion{Potion:\"hexcasting:enlarge_grid\"}", + "icon": "minecraft:potion[potion_contents={potion:\"hexcasting:enlarge_grid\"}]", "sortnum": 8, "advancement": "hexcasting:root", "read_by_default": true, @@ -14,7 +14,7 @@ "type": "patchouli:spotlight", "title": "hexcasting.page.potions.effects.header", "text": "hexcasting.page.potions.2", - "item": "minecraft:potion{Potion:\"hexcasting:enlarge_grid\"},minecraft:potion{Potion:\"hexcasting:enlarge_grid_long\"},minecraft:potion{Potion:\"hexcasting:enlarge_grid_strong\"},minecraft:potion{Potion:\"hexcasting:shrink_grid\"},minecraft:potion{Potion:\"hexcasting:shrink_grid_long\"},minecraft:potion{Potion:\"hexcasting:shrink_grid_strong\"}" + "item": "minecraft:potion[potion_contents={potion:\"hexcasting:enlarge_grid\"}],minecraft:potion[potion_contents={potion:\"hexcasting:enlarge_grid_long\"}],minecraft:potion[potion_contents={potion:\"hexcasting:enlarge_grid_strong\"}],minecraft:potion[potion_contents={potion:\"hexcasting:shrink_grid\"}],minecraft:potion[potion_contents={potion:\"hexcasting:shrink_grid_long\"}],minecraft:potion[potion_contents={potion:\"hexcasting:shrink_grid_strong\"}]" } ] } diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/make_battery.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/make_battery.json index 2ffd387b21..72ca052f7d 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/make_battery.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/make_battery.json @@ -1,7 +1,7 @@ { "name": "hexcasting.action.hexcasting:craft/battery", "category": "hexcasting:patterns/great_spells", - "icon": "hexcasting:battery{media:10000,max_media:10000}", + "icon": "hexcasting:battery", "sortnum": 6, "advancement": "hexcasting:root", "read_by_default": true, diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/zeniths.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/zeniths.json index b5899a67c3..12244fb0db 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/zeniths.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/great_spells/zeniths.json @@ -1,7 +1,7 @@ { "name": "hexcasting.entry.zeniths", "category": "hexcasting:patterns/great_spells", - "icon": "minecraft:potion{Potion:'minecraft:regeneration'}", + "icon": "minecraft:potion[potion_contents={potion:\"minecraft:regeneration\"}]", "advancement": "hexcasting:root", "sortnum": 4, "read_by_default": true, diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/hexcasting.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/hexcasting.json index 06cd64b47f..fbbdbc5d40 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/hexcasting.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/hexcasting.json @@ -1,7 +1,7 @@ { "name": "hexcasting.entry.hexcasting_spell", "category": "hexcasting:patterns/spells", - "icon": "hexcasting:artifact{patterns:[]}", + "icon": "hexcasting:artifact", "sortnum": 3, "advancement": "hexcasting:root", "read_by_default": true, diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/nadirs.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/nadirs.json index 8d7efd5c11..7c5c729461 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/nadirs.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/patterns/spells/nadirs.json @@ -1,7 +1,7 @@ { "name": "hexcasting.entry.nadirs", "category": "hexcasting:patterns/spells", - "icon": "minecraft:potion{Potion:'minecraft:poison'}", + "icon": "minecraft:potion[potion_contents={potion:\"minecraft:poison\"}]", "advancement": "hexcasting:root", "sortnum": 2, "read_by_default": true, diff --git a/Common/src/main/resources/data/hexcasting/recipes/directrix/empty.json b/Common/src/main/resources/data/hexcasting/recipes/directrix/empty.json new file mode 100644 index 0000000000..648758e5a6 --- /dev/null +++ b/Common/src/main/resources/data/hexcasting/recipes/directrix/empty.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "A": { + "item": "hexcasting:charged_amethyst" + }, + "C": { + "item": "minecraft:comparator" + }, + "O": { + "item": "minecraft:observer" + }, + "S": { + "item": "hexcasting:slate_block" + } + }, + "pattern": [ + "CSS", + "OAO", + "SSC" + ], + "result": { + "item": "hexcasting:directrix/empty" + }, + "show_notification": true +} diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index a70b99261b..34875c60ee 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -6,6 +6,7 @@ "package": "at.petrak.hexcasting.mixin", "mixins": [ "MixinAbstractVillager", + "MixinLivingEntity", "MixinMob", "MixinRaider", "MixinVillager", @@ -15,7 +16,6 @@ "accessor.AccessorEntity", "accessor.AccessorLivingEntity", "accessor.AccessorLootTable", - "accessor.AccessorPotionBrewing", "accessor.AccessorUseOnContext", "accessor.AccessorVillager", "accessor.CriteriaTriggersAccessor" diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricMixinReloadableServerResources.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricMixinReloadableServerResources.java index 70b6bc2113..05d1c7782e 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricMixinReloadableServerResources.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricMixinReloadableServerResources.java @@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Arrays; import java.util.concurrent.CompletableFuture; @Mixin(ReloadableServerResources.class) @@ -24,13 +23,12 @@ private static void onLoadResources(CallbackInfoReturnable { var amethystTable = rsr.getLootData().getLootTable(Blocks.AMETHYST_CLUSTER.getLootTable()); var theCoolerAmethystTable = (AccessorLootTable) amethystTable; - var oldFuncs = theCoolerAmethystTable.hex$getFunctions(); - var newFuncs = Arrays.copyOf(oldFuncs, oldFuncs.length + 1); + var oldFuncs = new java.util.ArrayList<>(theCoolerAmethystTable.hex$getFunctions()); var shardReducer = rsr.getLootData().getElement(new LootDataId<>(LootDataType.MODIFIER, FabricHexLootModJankery.FUNC_AMETHYST_SHARD_REDUCER)); if (shardReducer != null) { - newFuncs[newFuncs.length - 1] = shardReducer; - theCoolerAmethystTable.hex$setFunctions(newFuncs); - theCoolerAmethystTable.hex$setCompositeFunction(LootItemFunctions.compose(newFuncs)); + oldFuncs.add(shardReducer); + theCoolerAmethystTable.hex$setFunctions(oldFuncs); + theCoolerAmethystTable.hex$setCompositeFunction(LootItemFunctions.compose(oldFuncs)); } else { HexAPI.LOGGER.warn("{} was not found?", FabricHexLootModJankery.FUNC_AMETHYST_SHARD_REDUCER); } diff --git a/Forge/build.gradle b/Forge/build.gradle index 4ffb75e66e..74e5b70cb3 100644 --- a/Forge/build.gradle +++ b/Forge/build.gradle @@ -1,28 +1,10 @@ -buildscript { - repositories { - maven { url = 'https://maven.minecraftforge.net' } - maven { - url = 'https://repo.spongepowered.org/repository/maven-public/' - content { includeGroup "org.spongepowered" } - } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '6.0.+', changing: true - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - } -} - plugins { id "java" id "maven-publish" - id "at.petra-k.pkpcpbp.PKSubprojPlugin" + id "net.neoforged.moddev" version "2.0.140" } -apply plugin: 'net.minecraftforge.gradle' -apply plugin: 'org.spongepowered.mixin' - pkSubproj { pkPublish = true curseforgeJar = jar.archiveFile @@ -30,168 +12,101 @@ pkSubproj { "paucal", "patchouli", "caelus", - "inline", ]) modrinthJar = jar.archiveFile modrinthDependencies([ - "paucal:HyBiJPtT", // 0.6.0-forge + "paucal:HyBiJPtT", "patchouli:1.20.1-80-forge", "caelus:3.1.0+1.20", - "inline:1.20.1-1.0.1-forge", ]) } repositories { + mavenLocal() mavenCentral() - - // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: - flatDir { - dir 'libs' - } - - 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" - } - // caelus elytra + maven { name = "JEI"; url = "https://maven.blamejared.com" } + flatDir { dir 'libs' } + maven { name = "Progwml6 maven"; url = "https://dvs1.progwml6.com/files/maven/" } + maven { name = "ModMaven"; url = "https://modmaven.dev" } maven { url = "https://maven.theillusivec4.top" } - // pehkui maven { url = "https://jitpack.io" } - maven { name = 'Kotlin for Forge' url = 'https://thedarkcolour.github.io/KotlinForForge/' content { includeGroup "thedarkcolour" } } - - maven { url "https://maven.shedaniel.me/" } + maven { url = "https://maven.shedaniel.me/" } + maven { url = 'https://maven.neoforged.net/releases' } + maven { url = 'https://api.modrinth.com/maven' } + maven { url = 'https://maven.modrinth.one' } } dependencies { - minecraft "net.minecraftforge:forge:${minecraftVersion}-${forgeVersion}" compileOnly project(":Common") - - implementation "thedarkcolour:kotlinforforge:$kotlinForForgeVersion" - + implementation "thedarkcolour:kotlinforforge-neoforge:$kotlinForForgeVersion" annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - compileOnly fg.deobf("at.petra-k.paucal:paucal-forge-$minecraftVersion:$paucalVersion") - runtimeOnly fg.deobf("at.petra-k.paucal:paucal-forge-$minecraftVersion:$paucalVersion") - compileOnly fg.deobf("vazkii.patchouli:Patchouli:$minecraftVersion-$patchouliVersion-FORGE-SNAPSHOT") - runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:$minecraftVersion-$patchouliVersion-FORGE-SNAPSHOT") - - // aughh - testCompileOnly fg.deobf("at.petra-k.paucal:paucal-forge-$minecraftVersion:$paucalVersion") - testCompileOnly fg.deobf("vazkii.patchouli:Patchouli:$minecraftVersion-$patchouliVersion-FORGE-SNAPSHOT") - - implementation fg.deobf("top.theillusivec4.caelus:caelus-forge:$caelusVersion") + compileOnly "at.petrak:paucal-neoforge-${minecraftVersion}:${paucalVersion}" + runtimeOnly "at.petrak:paucal-neoforge-${minecraftVersion}:${paucalVersion}" + compileOnly files('libs/Patchouli-1.21.1-92-NEOFORGE.jar') + runtimeOnly files('libs/Patchouli-1.21.1-92-NEOFORGE.jar') + compileOnly files('libs/caelus-neoforge-7.0.1+1.21.1.jar') + runtimeOnly files('libs/caelus-neoforge-7.0.1+1.21.1.jar') - implementation fg.deobf("com.samsthenerd.inline:inline-forge:$minecraftVersion-$inlineVersion") + compileOnly "top.theillusivec4.curios:curios-neoforge:9.4.0+1.21.1" + // runtimeOnly "top.theillusivec4.curios:curios-neoforge:9.4.0+1.21.1" - // needed for inline to run - runtimeOnly fg.deobf("me.shedaniel.cloth:cloth-config-forge:$clothConfigVersion") + compileOnly "mezz.jei:jei-${minecraftVersion}-neoforge-api:${jeiVersion}" + runtimeOnly "mezz.jei:jei-${minecraftVersion}-neoforge:${jeiVersion}" - // Optional interop + // compileOnly "maven.modrinth:inline:${minecraftVersion}-${inlineVersion}-neoforge" - compileOnly fg.deobf("mezz.jei:jei-$minecraftVersion-common-api:$jeiVersion") - compileOnly fg.deobf("mezz.jei:jei-$minecraftVersion-forge-api:$jeiVersion") - runtimeOnly fg.deobf("mezz.jei:jei-$minecraftVersion-forge:$jeiVersion") - - compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:$curiosVersion+$minecraftVersion:api") - runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:$curiosVersion+$minecraftVersion") - - api fg.deobf("com.github.Virtuoel:Pehkui:${pehkuiVersion}-$minecraftVersion-forge") + testCompileOnly "at.petrak:paucal-neoforge-${minecraftVersion}:${paucalVersion}" + testCompileOnly "vazkii.patchouli:Patchouli:${minecraftVersion}-${patchouliVersion}-NEOFORGE-SNAPSHOT" } -minecraft { - mappings channel: 'official', version: minecraftVersion - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') +def commonMain = project(":Common").sourceSets.main - if (project.hasProperty('forge_ats_enabled') && project.findProperty('forge_ats_enabled').toBoolean()) { - // This location is hardcoded in Forge and can not be changed. - // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - project.logger.debug('Forge Access Transformers are enabled for this project.') - } +neoForge { + version = project.neoforgeVersion + accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg') runs { client { - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - mods { - create(modID) { - source sourceSets.main - source project(":Common").sourceSets.main - } - } + client() + systemProperty 'neoforge.enabledGameTestNamespaces', modID } - server { - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - mods { - create(modID) { - source sourceSets.main - source project(":Common").sourceSets.main - } - } + server() + programArgument '--nogui' + systemProperty 'neoforge.enabledGameTestNamespaces', modID + } + data { + data() + programArguments.addAll '--mod', modID, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() } - - // We have to have a dummy data run to be parented from - data {} - xplatDatagen { - parent minecraft.runs.data - - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - args '--mod', modID, '--all', '--output', file('../Common/src/generated/resources/'), '--existing', file('../Common/src/main/resources/') - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - property 'hexcasting.xplat_datagen', 'true' - - mods { - create(modID) { - source sourceSets.main - source project(":Common").sourceSets.main - } - } + data() + programArguments.addAll '--mod', modID, '--all', '--output', file('../Common/src/generated/resources/').getAbsolutePath(), '--existing', file('../Common/src/main/resources/').getAbsolutePath() + systemProperty 'hexcasting.xplat_datagen', 'true' } - forgeDatagen { - parent minecraft.runs.data - - workingDirectory project.file('run') - ideaModule "${rootProject.name}.${project.name}.main" - args '--mod', modID, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - property 'hexcasting.forge_datagen', 'true' - mods { - create(modID) { - source sourceSets.main - source project(":Common").sourceSets.main - } - } + data() + programArguments.addAll '--mod', modID, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + systemProperty 'hexcasting.forge_datagen', 'true' + } + configureEach { + systemProperty 'forge.logging.markers', 'REGISTRIES' + logLevel = org.slf4j.event.Level.DEBUG } } -} - -mixin { - add sourceSets.main, "hexcasting.mixins.refmap.json" - config "hexplat.mixins.json" - config "hexcasting_forge.mixins.json" + mods { + "${modID}" { + sourceSet sourceSets.main + sourceSet commonMain + } + } } compileJava { @@ -207,16 +122,18 @@ compileTestKotlin { sourceSets { main.resources.srcDirs += ['src/generated/resources', '../Common/src/generated/resources'] main.kotlin.srcDirs += 'src/main/java' + main.java.exclude 'at/petrak/hexcasting/forge/datagen/**' test.kotlin.srcDirs += 'src/main/java' } processResources { + duplicatesStrategy = DuplicatesStrategy.INCLUDE from project(":Common").sourceSets.main.resources inputs.property "version", project.version - filesMatching("mods.toml") { expand "version": project.version } + filesMatching("neoforge.mods.toml") { + expand "version": project.version + } } - -jar.finalizedBy('reobfJar') diff --git a/Forge/gradle.properties b/Forge/gradle.properties index 8b3c7f47f9..cd407bd2a3 100644 --- a/Forge/gradle.properties +++ b/Forge/gradle.properties @@ -1,8 +1,4 @@ -platform=forge +platform=neoforge -forgeVersion=47.1.47 - -kotlinForForgeVersion=4.3.0 - -curiosVersion=5.2.0-beta.3 -caelusVersion=3.1.0+1.20 +kotlinForForgeVersion=5.6.0 +caelusVersion=7.0.1+1.21.1 diff --git a/Forge/libs/Patchouli-1.21.1-92-NEOFORGE.jar b/Forge/libs/Patchouli-1.21.1-92-NEOFORGE.jar new file mode 100644 index 0000000000000000000000000000000000000000..3a1c67f451d089b89c563ad98ca466cd5bd95bc1 GIT binary patch literal 646486 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 M?HO4N7Y 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∓AJ>|7n;|Y@<8z$vLbzPy(dHN;YAmD!ToLVGL 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[l)$8!k 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

S_S5 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

AJX!=x7S7h33u#jb#R(o|DMekSL}zyQHP3l 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�{2Nctwqdu) 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 E50`ZSv;Y7A literal 0 HcmV?d00001 diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index 30e0e2a53e..c73962664f 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -2,6 +2,8 @@ import at.petrak.hexcasting.client.ClientTickCounter; import at.petrak.hexcasting.client.RegisterClientStuff; +import at.petrak.hexcasting.common.msgs.*; +import at.petrak.hexcasting.forge.network.*; import at.petrak.hexcasting.client.ShiftScrollListener; import at.petrak.hexcasting.client.gui.PatternTooltipComponent; import at.petrak.hexcasting.client.model.AltioraLayer; @@ -13,8 +15,8 @@ import at.petrak.hexcasting.common.misc.PatternTooltip; import at.petrak.hexcasting.interop.HexInterop; import net.minecraft.client.Minecraft; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.resources.ResourceLocation; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.particle.ParticleProvider; @@ -23,68 +25,61 @@ import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraftforge.client.event.*; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import java.io.IOException; import java.util.function.Function; // This is Java because I can't kotlin-fu some of the consumers public class ForgeHexClientInitializer { - // We copy Fabric's example; it mixes in on the return of the initializer and sticks it in a global variable. - // So here's our global. - public static ItemColors GLOBAL_ITEM_COLORS; - public static BlockColors GLOBAL_BLOCK_COLORS; @SubscribeEvent public static void clientInit(FMLClientSetupEvent evt) { - evt.enqueueWork(() -> { - RegisterClientStuff.init(); - RegisterClientStuff.registerColorProviders( - (colorizer, item) -> GLOBAL_ITEM_COLORS.register(colorizer, item), - (colorizer, block) -> GLOBAL_BLOCK_COLORS.register(colorizer, block)); - }); + evt.enqueueWork(RegisterClientStuff::init); - var evBus = MinecraftForge.EVENT_BUS; + var evBus = NeoForge.EVENT_BUS; evBus.addListener((ClientPlayerNetworkEvent.LoggingIn e) -> PatternRegistryManifest.processRegistry(null)); evBus.addListener((RenderLevelStageEvent e) -> { if (e.getStage().equals(RenderLevelStageEvent.Stage.AFTER_PARTICLES)) { - HexAdditionalRenderers.overlayLevel(e.getPoseStack(), e.getPartialTick()); + HexAdditionalRenderers.overlayLevel(e.getPoseStack(), e.getPartialTick().getGameTimeDeltaPartialTick(true)); } }); evBus.addListener((RenderGuiEvent.Post e) -> { - HexAdditionalRenderers.overlayGui(e.getGuiGraphics(), e.getPartialTick()); + HexAdditionalRenderers.overlayGui(e.getGuiGraphics(), e.getPartialTick().getGameTimeDeltaPartialTick(true)); }); - evBus.addListener((TickEvent.RenderTickEvent e) -> { - if (e.phase == TickEvent.Phase.START) { - ClientTickCounter.renderTickStart(e.renderTickTime); - } - }); + evBus.addListener((RenderFrameEvent.Pre e) -> + ClientTickCounter.renderTickStart(e.getPartialTick().getGameTimeDeltaPartialTick(true))); - evBus.addListener((TickEvent.ClientTickEvent e) -> { - if (e.phase == TickEvent.Phase.END) { - ClientTickCounter.clientTickEnd(); - ShiftScrollListener.clientTickEnd(); - } + evBus.addListener((ClientTickEvent.Post e) -> { + ClientTickCounter.clientTickEnd(); + ShiftScrollListener.clientTickEnd(); }); evBus.addListener((InputEvent.MouseScrollingEvent e) -> { - var cancel = ShiftScrollListener.onScrollInGameplay(e.getScrollDelta()); + var cancel = ShiftScrollListener.onScrollInGameplay((float) e.getScrollDeltaY()); e.setCanceled(cancel); }); HexInterop.clientInit(); } + @SubscribeEvent + public static void registerColors(RegisterColorHandlersEvent.Item evt) { + RegisterClientStuff.registerColorProviders( + (colorizer, item) -> evt.getItemColors().register(colorizer, item), + (colorizer, block) -> evt.getBlockColors().register(colorizer, block)); + } + @SubscribeEvent public static void registerShaders(RegisterShadersEvent evt) throws IOException { HexShaders.init(evt.getResourceProvider(), p -> evt.registerShader(p.getFirst(), p.getSecond())); @@ -115,12 +110,19 @@ public static void registerTooltipComponents(RegisterClientTooltipComponentFacto @SubscribeEvent public static void onModelRegister(ModelEvent.RegisterAdditional evt) { var recMan = Minecraft.getInstance().getResourceManager(); - RegisterClientStuff.onModelRegister(recMan, evt::register); + RegisterClientStuff.onModelRegister(recMan, + loc -> evt.register(ModelResourceLocation.standalone(loc))); } @SubscribeEvent - public static void onModelBake(ModelEvent.BakingCompleted evt) { - RegisterClientStuff.onModelBake(evt.getModelBakery(), evt.getModels()); + public static void onModelBake(ModelEvent.ModifyBakingResult evt) { + var models = evt.getModels(); + var modelMap = new java.util.HashMap(); + for (var entry : models.entrySet()) { + var key = entry.getKey(); + modelMap.put(key.id(), entry.getValue()); + } + RegisterClientStuff.onModelBake(evt.getModelBakery(), modelMap); } @SubscribeEvent diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java index dd3eb257e3..6de79bca01 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -4,7 +4,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import net.minecraft.util.RandomSource; import java.util.List; @@ -12,16 +12,16 @@ import static at.petrak.hexcasting.api.mod.HexConfig.noneMatch; public class ForgeHexConfig implements HexConfig.CommonConfigAccess { - private static ForgeConfigSpec.LongValue dustMediaAmount; - private static ForgeConfigSpec.LongValue shardMediaAmount; - private static ForgeConfigSpec.LongValue chargedCrystalMediaAmount; - private static ForgeConfigSpec.DoubleValue mediaToHealthRate; + private static ModConfigSpec.LongValue dustMediaAmount; + private static ModConfigSpec.LongValue shardMediaAmount; + private static ModConfigSpec.LongValue chargedCrystalMediaAmount; + private static ModConfigSpec.DoubleValue mediaToHealthRate; - private static ForgeConfigSpec.IntValue cypherCooldown; - private static ForgeConfigSpec.IntValue trinketCooldown; - private static ForgeConfigSpec.IntValue artifactCooldown; + private static ModConfigSpec.IntValue cypherCooldown; + private static ModConfigSpec.IntValue trinketCooldown; + private static ModConfigSpec.IntValue artifactCooldown; - public ForgeHexConfig(ForgeConfigSpec.Builder builder) { + public ForgeHexConfig(ModConfigSpec.Builder builder) { builder.push("Media Amounts"); dustMediaAmount = builder.comment("How much media a single Amethyst Dust item is worth") .defineInRange("dustMediaAmount", DEFAULT_DUST_MEDIA_AMOUNT, 0, Integer.MAX_VALUE); @@ -79,14 +79,14 @@ public int artifactCooldown() { } public static class Client implements HexConfig.ClientConfigAccess { - private static ForgeConfigSpec.BooleanValue ctrlTogglesOffStrokeOrder; - private static ForgeConfigSpec.BooleanValue invertSpellbookScrollDirection; - private static ForgeConfigSpec.BooleanValue invertAbacusScrollDirection; - private static ForgeConfigSpec.DoubleValue gridSnapThreshold; - private static ForgeConfigSpec.BooleanValue clickingTogglesDrawing; - private static ForgeConfigSpec.BooleanValue alwaysShowListCommas; - - public Client(ForgeConfigSpec.Builder builder) { + private static ModConfigSpec.BooleanValue ctrlTogglesOffStrokeOrder; + private static ModConfigSpec.BooleanValue invertSpellbookScrollDirection; + private static ModConfigSpec.BooleanValue invertAbacusScrollDirection; + private static ModConfigSpec.DoubleValue gridSnapThreshold; + private static ModConfigSpec.BooleanValue clickingTogglesDrawing; + private static ModConfigSpec.BooleanValue alwaysShowListCommas; + + public Client(ModConfigSpec.Builder builder) { ctrlTogglesOffStrokeOrder = builder.comment( "Whether the ctrl key will instead turn *off* the color gradient on patterns") .define("ctrlTogglesOffStrokeOrder", DEFAULT_CTRL_TOGGLES_OFF_STROKE_ORDER); @@ -141,19 +141,19 @@ public boolean alwaysShowListCommas() { } public static class Server implements HexConfig.ServerConfigAccess { - private static ForgeConfigSpec.IntValue opBreakHarvestLevel; - private static ForgeConfigSpec.IntValue maxOpCount; - private static ForgeConfigSpec.IntValue maxSpellCircleLength; - private static ForgeConfigSpec.ConfigValue> actionDenyList; - private static ForgeConfigSpec.ConfigValue> circleActionDenyList; - - private static ForgeConfigSpec.BooleanValue greaterTeleportSplatsItems; - private static ForgeConfigSpec.BooleanValue villagersOffendedByMindMurder; - private static ForgeConfigSpec.ConfigValue> tpDimDenyList; - private static ForgeConfigSpec.BooleanValue doesTrueNameHaveAmbit; - private static ForgeConfigSpec.DoubleValue traderScrollChance; - - public Server(ForgeConfigSpec.Builder builder) { + private static ModConfigSpec.IntValue opBreakHarvestLevel; + private static ModConfigSpec.IntValue maxOpCount; + private static ModConfigSpec.IntValue maxSpellCircleLength; + private static ModConfigSpec.ConfigValue> actionDenyList; + private static ModConfigSpec.ConfigValue> circleActionDenyList; + + private static ModConfigSpec.BooleanValue greaterTeleportSplatsItems; + private static ModConfigSpec.BooleanValue villagersOffendedByMindMurder; + private static ModConfigSpec.ConfigValue> tpDimDenyList; + private static ModConfigSpec.BooleanValue doesTrueNameHaveAmbit; + private static ModConfigSpec.DoubleValue traderScrollChance; + + public Server(ModConfigSpec.Builder builder) { builder.push("Spells"); maxOpCount = builder.comment("The maximum number of actions that can be executed in one tick, to avoid " + "hanging the server.") @@ -251,7 +251,7 @@ public double traderScrollChance() { } private static boolean isValidReslocArg(Object o) { - return o instanceof String s && ResourceLocation.isValidResourceLocation(s); + return o instanceof String s && ResourceLocation.tryParse(s) != null; } } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java index 39bd896580..1cdb92c99d 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java @@ -21,15 +21,12 @@ import at.petrak.hexcasting.forge.cap.CapSyncers; import at.petrak.hexcasting.forge.cap.ForgeCapabilityHandler; import at.petrak.hexcasting.forge.cap.adimpl.CapClientCastingStack; -import at.petrak.hexcasting.forge.datagen.ForgeHexDataGenerators; import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop; import at.petrak.hexcasting.forge.interop.curios.CuriosRenderers; import at.petrak.hexcasting.forge.lib.ForgeHexArgumentTypeRegistry; import at.petrak.hexcasting.forge.lib.ForgeHexLootMods; -import at.petrak.hexcasting.forge.network.ForgePacketHandler; import at.petrak.hexcasting.forge.network.MsgBrainsweepAck; -import at.petrak.hexcasting.forge.recipe.ForgeModConditionalIngredient; -import at.petrak.hexcasting.forge.recipe.ForgeUnsealedIngredient; +import at.petrak.hexcasting.forge.lib.ForgeHexIngredientTypes; import at.petrak.hexcasting.interop.HexInterop; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.core.MappedRegistry; @@ -47,55 +44,56 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockSetType; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.ToolActions; -import net.minecraftforge.common.crafting.CraftingHelper; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.EntityAttributeModificationEvent; -import net.minecraftforge.event.entity.living.LivingConversionEvent; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.registries.RegisterEvent; -import thedarkcolour.kotlinforforge.KotlinModLoadingContext; - +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.ModList; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; +import net.neoforged.neoforge.event.tick.LevelTickEvent; +import net.neoforged.neoforge.event.entity.EntityAttributeModificationEvent; +import net.neoforged.neoforge.event.entity.living.LivingConversionEvent; +import net.neoforged.neoforge.event.tick.EntityTickEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.registries.RegisterEvent; import java.util.function.BiConsumer; import java.util.function.Consumer; @Mod(HexAPI.MOD_ID) public class ForgeHexInitializer { - public ForgeHexInitializer() { + private static IEventBus MOD_BUS; + + public ForgeHexInitializer(IEventBus modBus) { + MOD_BUS = modBus; initConfig(); initRegistries(); initRegistry(); - initListeners(); + initListeners(modBus); } private static void initConfig() { - var config = new ForgeConfigSpec.Builder().configure(ForgeHexConfig::new); - var clientConfig = new ForgeConfigSpec.Builder().configure(ForgeHexConfig.Client::new); - var serverConfig = new ForgeConfigSpec.Builder().configure(ForgeHexConfig.Server::new); + var config = new ModConfigSpec.Builder().configure(ForgeHexConfig::new); + var clientConfig = new ModConfigSpec.Builder().configure(ForgeHexConfig.Client::new); + var serverConfig = new ModConfigSpec.Builder().configure(ForgeHexConfig.Server::new); HexConfig.setCommon(config.getLeft()); HexConfig.setClient(clientConfig.getLeft()); HexConfig.setServer(serverConfig.getLeft()); - var mlc = ModLoadingContext.get(); - mlc.registerConfig(ModConfig.Type.COMMON, config.getRight()); - mlc.registerConfig(ModConfig.Type.CLIENT, clientConfig.getRight()); - mlc.registerConfig(ModConfig.Type.SERVER, serverConfig.getRight()); + var modContainer = ModList.get().getModContainerById(HexAPI.MOD_ID).orElseThrow(); + modContainer.registerConfig(ModConfig.Type.COMMON, config.getRight()); + modContainer.registerConfig(ModConfig.Type.CLIENT, clientConfig.getRight()); + modContainer.registerConfig(ModConfig.Type.SERVER, serverConfig.getRight()); } public static void initRegistries() { @@ -134,6 +132,8 @@ private static void initRegistry() { bind(Registries.PARTICLE_TYPE, HexParticles::registerParticles); + bind(Registries.DATA_COMPONENT_TYPE, reg -> reg.accept(HexDataComponents.STACK_DATA, HexAPI.modLoc("stack_data"))); + bind(HexRegistries.IOTA_TYPE, HexIotaTypes::registerTypes); bind(HexRegistries.ACTION, HexActions::register); bind(HexRegistries.SPECIAL_HANDLER, HexSpecialHandlers::register); @@ -141,10 +141,15 @@ private static void initRegistry() { bind(HexRegistries.CONTINUATION_TYPE, HexContinuationTypes::registerContinuations); bind(HexRegistries.EVAL_SOUND, HexEvalSounds::register); - ForgeHexArgumentTypeRegistry.ARGUMENT_TYPES.register(getModEventBus()); - ForgeHexLootMods.REGISTRY.register(getModEventBus()); + ForgeHexArgumentTypeRegistry.ARGUMENT_TYPES.register(MOD_BUS); + ForgeHexLootMods.REGISTRY.register(MOD_BUS); - HexAdvancementTriggers.registerTriggers(); + // Advancement triggers must be registered via RegisterEvent (registry is frozen during mod init) + bind(Registries.TRIGGER_TYPE, reg -> { + reg.accept(HexAdvancementTriggers.OVERCAST_TRIGGER, HexAPI.modLoc("overcast")); + reg.accept(HexAdvancementTriggers.SPEND_MEDIA_TRIGGER, HexAPI.modLoc("spend_media")); + reg.accept(HexAdvancementTriggers.FAIL_GREAT_SPELL_TRIGGER, HexAPI.modLoc("fail_to_cast_great_spell")); + }); RegisterMisc.register(); } @@ -152,22 +157,22 @@ private static void initRegistry() { // https://github.com/VazkiiMods/Botania/blob/1.18.x/Forge/src/main/java/vazkii/botania/forge/ForgeCommonInitializer.java private static void bind(ResourceKey> registry, Consumer> source) { - getModEventBus().addListener((RegisterEvent event) -> { + MOD_BUS.addListener((RegisterEvent event) -> { if (registry.equals(event.getRegistryKey())) { source.accept((t, rl) -> event.register(registry, rl, () -> t)); } }); } - private static void initListeners() { - var modBus = getModEventBus(); - var evBus = MinecraftForge.EVENT_BUS; + private static void initListeners(IEventBus modBus) { + var evBus = NeoForge.EVENT_BUS; - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> modBus.register(ForgeHexClientInitializer.class)); + if (FMLEnvironment.dist == Dist.CLIENT) { + modBus.register(ForgeHexClientInitializer.class); // client init, colors, particles, etc. + } modBus.addListener((FMLCommonSetupEvent evt) -> evt.enqueueWork(() -> { - ForgePacketHandler.init(); HexComposting.setup(); HexStrippables.init(); // Forge does not strictly require TreeGrowers to initialize during early game stages, unlike Fabric @@ -186,13 +191,16 @@ private static void initListeners() { HexItems.registerItemCreativeTab(evt, evt.getTab()); }); + // RegisterBrewingRecipesEvent is on NeoForge bus, not mod bus + evBus.addListener((RegisterBrewingRecipesEvent evt) -> + HexPotions.addRecipes(evt.getBuilder())); + + + ForgeHexIngredientTypes.INGREDIENT_TYPES.register(modBus); // We have to do these at some point when the registries are still open modBus.addListener((RegisterEvent evt) -> { if (evt.getRegistryKey().equals(Registries.ITEM)) { - CraftingHelper.register(ForgeUnsealedIngredient.ID, ForgeUnsealedIngredient.Serializer.INSTANCE); - CraftingHelper.register(ForgeModConditionalIngredient.ID, - ForgeModConditionalIngredient.Serializer.INSTANCE); HexStatistics.register(); HexLootFunctions.registerSerializers((lift, id) -> Registry.register(BuiltInRegistries.LOOT_FUNCTION_TYPE, id, lift)); @@ -212,15 +220,15 @@ private static void initListeners() { evBus.addListener((LivingConversionEvent.Post evt) -> BrainsweepingEvents.copyBrainsweepPostTransformation(evt.getEntity(), evt.getOutcome())); - evBus.addListener((LivingEvent.LivingTickEvent evt) -> { + evBus.addListener((EntityTickEvent.Post evt) -> { if (evt.getEntity() instanceof ServerPlayer splayer) { OpFlight.tickDownFlight(splayer); OpAltiora.checkPlayerCollision(splayer); } }); - evBus.addListener((TickEvent.LevelTickEvent evt) -> { - if (evt.phase == TickEvent.Phase.END && evt.level instanceof ServerLevel world) { + evBus.addListener((LevelTickEvent.Post evt) -> { + if (evt.getLevel() instanceof ServerLevel world) { PlayerPositionRecorder.updateAllPlayers(world); } }); @@ -248,14 +256,13 @@ private static void initListeners() { Entity target = evt.getTarget(); if (evt.getTarget() instanceof ServerPlayer serverPlayer && target instanceof Mob mob && IXplatAbstractions.INSTANCE.isBrainswept(mob)) { - ForgePacketHandler.getNetwork() - .send(PacketDistributor.PLAYER.with(() -> serverPlayer), MsgBrainsweepAck.of(mob)); + PacketDistributor.sendToPlayer(serverPlayer, MsgBrainsweepAck.of(mob)); } }); // Implemented with a mixin on Farbc evBus.addListener((BlockEvent.BlockToolModificationEvent evt) -> { - if (!evt.isSimulated() && evt.getToolAction() == ToolActions.AXE_STRIP) { + if (!evt.isSimulated() && evt.getItemAbility() == ItemAbilities.AXE_STRIP) { BlockState bs = evt.getState(); var output = HexStrippables.STRIPPABLES.get(bs.getBlock()); if (output != null) { @@ -264,35 +271,33 @@ private static void initListeners() { } }); - // Caps are cardinal components on farbc - modBus.addListener(ForgeCapabilityHandler::registerCaps); - evBus.addGenericListener(ItemStack.class, ForgeCapabilityHandler::attachItemCaps); - evBus.addGenericListener(BlockEntity.class, ForgeCapabilityHandler::attachBlockEntityCaps); - evBus.addGenericListener(Entity.class, ForgeCapabilityHandler::attachEntityCaps); + // Capabilities - register providers via RegisterCapabilitiesEvent (replaces AttachCapabilitiesEvent) + modBus.addListener(ForgeCapabilityHandler::registerCapabilities); - modBus.register(ForgeHexDataGenerators.class); - modBus.register(ForgeCapabilityHandler.class); + try { + modBus.register(Class.forName("at.petrak.hexcasting.forge.datagen.ForgeHexDataGenerators")); + } catch (ClassNotFoundException ignored) { + // Datagen package excluded from build + } + // ForgeCapabilityHandler uses addListener(registerCapabilities), no @SubscribeEvent evBus.register(CapSyncers.class); modBus.addListener((EntityAttributeModificationEvent e) -> { - e.add(EntityType.PLAYER, HexAttributes.GRID_ZOOM); - e.add(EntityType.PLAYER, HexAttributes.SCRY_SIGHT); - e.add(EntityType.PLAYER, HexAttributes.FEEBLE_MIND); - e.add(EntityType.PLAYER, HexAttributes.MEDIA_CONSUMPTION_MODIFIER); - e.add(EntityType.PLAYER, HexAttributes.AMBIT_RADIUS); - e.add(EntityType.PLAYER, HexAttributes.SENTINEL_RADIUS); + var attrs = BuiltInRegistries.ATTRIBUTE; + e.add(EntityType.PLAYER, attrs.getHolderOrThrow(HexAttributes.GRID_ZOOM_KEY)); + e.add(EntityType.PLAYER, attrs.getHolderOrThrow(HexAttributes.SCRY_SIGHT_KEY)); + e.add(EntityType.PLAYER, attrs.getHolderOrThrow(HexAttributes.FEEBLE_MIND_KEY)); + e.add(EntityType.PLAYER, attrs.getHolderOrThrow(HexAttributes.MEDIA_CONSUMPTION_MODIFIER_KEY)); + e.add(EntityType.PLAYER, attrs.getHolderOrThrow(HexAttributes.AMBIT_RADIUS_KEY)); + e.add(EntityType.PLAYER, attrs.getHolderOrThrow(HexAttributes.SENTINEL_RADIUS_KEY)); }); if (ModList.get().isLoaded(HexInterop.Forge.CURIOS_API_ID)) { modBus.addListener(CuriosApiInterop::onInterModEnqueue); modBus.addListener(CuriosApiInterop::onClientSetup); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> modBus.addListener(CuriosRenderers::onLayerRegister)); + if (FMLEnvironment.dist == Dist.CLIENT) { + modBus.addListener(CuriosRenderers::onLayerRegister); + } } } - - // aaaauughhg - private static IEventBus getModEventBus() { - return KotlinModLoadingContext.Companion.get().getKEventBus(); - } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/CapSyncers.java b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/CapSyncers.java index 89e26d4474..c29c54e76a 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/CapSyncers.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/CapSyncers.java @@ -6,10 +6,17 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.tick.EntityTickEvent; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class CapSyncers { + private static final int LOGIN_SYNC_MAX_TICKS = 200; + private static final ConcurrentHashMap PENDING_LOGIN_SYNC = new ConcurrentHashMap<>(); + @SubscribeEvent public static void copyDataOnDeath(PlayerEvent.Clone evt) { var eitherSidePlayer = evt.getEntity(); @@ -38,21 +45,47 @@ public static void syncDataOnLogin(PlayerEvent.PlayerLoggedInEvent evt) { if (!(evt.getEntity() instanceof ServerPlayer player)) { return; } + // PlayerLoggedInEvent fires before the connection is always ready for play packets. + // Retry for a short window until NeoForge allows our payloads. + PENDING_LOGIN_SYNC.put(player.getUUID(), LOGIN_SYNC_MAX_TICKS); + } + @SubscribeEvent + public static void syncDataOnRejoin(PlayerEvent.PlayerRespawnEvent evt) { + if (!(evt.getEntity() instanceof ServerPlayer player)) { + return; + } + // Respawn is in play phase; sync immediately. syncSentinel(player); syncPigment(player); syncAltiora(player); } @SubscribeEvent - public static void syncDataOnRejoin(PlayerEvent.PlayerRespawnEvent evt) { + public static void retryLoginSync(EntityTickEvent.Post evt) { if (!(evt.getEntity() instanceof ServerPlayer player)) { return; } - syncSentinel(player); - syncPigment(player); - syncAltiora(player); + var uuid = player.getUUID(); + var remaining = PENDING_LOGIN_SYNC.get(uuid); + if (remaining == null) { + return; + } + if (remaining <= 0) { + PENDING_LOGIN_SYNC.remove(uuid); + return; + } + + try { + syncSentinel(player); + syncPigment(player); + syncAltiora(player); + PENDING_LOGIN_SYNC.remove(uuid); + } catch (UnsupportedOperationException e) { + // Still in configuration phase / channels not ready yet. + PENDING_LOGIN_SYNC.put(uuid, remaining - 1); + } } public static void syncSentinel(ServerPlayer player) { diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java index 502357ab3a..ac2a068e8d 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java @@ -8,209 +8,156 @@ import at.petrak.hexcasting.api.misc.MediaConstants; import at.petrak.hexcasting.api.mod.HexConfig; import at.petrak.hexcasting.common.entities.EntityWallScroll; -import at.petrak.hexcasting.common.items.HexBaubleItem; +import at.petrak.hexcasting.common.entities.HexEntities; import at.petrak.hexcasting.common.lib.HexBlocks; +import at.petrak.hexcasting.common.lib.HexBlockEntities; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.forge.cap.adimpl.*; import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop; import at.petrak.hexcasting.interop.HexInterop; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.common.util.NonNullSupplier; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.function.BooleanSupplier; -import java.util.function.Function; +import net.minecraft.world.level.ItemLike; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.ICapabilityProvider; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; + +import java.util.ArrayList; +import java.util.List; import static at.petrak.hexcasting.api.HexAPI.modLoc; public class ForgeCapabilityHandler { - /** - * Items that store an iota to their tag. - */ - public static final ResourceLocation IOTA_STORAGE_CAP = modLoc("iota_holder"); - /** - * Items that intrinsically store an iota. - */ - public static final ResourceLocation IOTA_STATIC_CAP = modLoc("iota_item"); - /** - * Items that store a variable amount of media to their tag. - */ - public static final ResourceLocation MEDIA_STORAGE_CAP = modLoc("media_holder"); - /** - * Items that statically provide media. - */ - public static final ResourceLocation MEDIA_STATIC_CAP = modLoc("media_item"); - /** - * Items that store a packaged Hex. - */ - public static final ResourceLocation HEX_HOLDER_CAP = modLoc("hex_item"); - /** - * Items that have multiple visual variants. - */ - public static final ResourceLocation VARIANT_ITEM_CAP = modLoc("variant_item"); - /** - * Items that work as pigments. - */ - public static final ResourceLocation PIGMENT_CAP = modLoc("pigment"); - public static final ResourceLocation CURIO_CAP = modLoc("curio"); - - public static final ResourceLocation IMPETUS_HANDLER = modLoc("impetus_items"); - - /** - * Used to render the pattern spiral around players while casting. - */ - public static final ResourceLocation PATTERN_SPIRAL = modLoc("pattern_spiral"); - - public static void registerCaps(RegisterCapabilitiesEvent evt) { - evt.register(ADMediaHolder.class); - evt.register(ADIotaHolder.class); - evt.register(ADHexHolder.class); - evt.register(ADPigment.class); - } - - public static void attachItemCaps(AttachCapabilitiesEvent evt) { - ItemStack stack = evt.getObject(); - - if (stack.getItem() instanceof MediaHolderItem holder) { - evt.addCapability(MEDIA_STORAGE_CAP, - provide(stack, HexCapabilities.MEDIA, () -> new CapItemMediaHolder(holder, stack))); - } else if (stack.is(HexItems.AMETHYST_DUST)) { - evt.addCapability(MEDIA_STATIC_CAP, provide(stack, HexCapabilities.MEDIA, () -> - new CapStaticMediaHolder(HexConfig.common()::dustMediaAmount, ADMediaHolder.AMETHYST_DUST_PRIORITY, - stack))); - } else if (stack.is(Items.AMETHYST_SHARD)) { - evt.addCapability(MEDIA_STATIC_CAP, provide(stack, HexCapabilities.MEDIA, () -> new CapStaticMediaHolder( - HexConfig.common()::shardMediaAmount, ADMediaHolder.AMETHYST_SHARD_PRIORITY, stack))); - } else if (stack.is(HexItems.CHARGED_AMETHYST)) { - evt.addCapability(MEDIA_STATIC_CAP, - provide(stack, HexCapabilities.MEDIA, () -> new CapStaticMediaHolder( - HexConfig.common()::chargedCrystalMediaAmount, ADMediaHolder.CHARGED_AMETHYST_PRIORITY, stack))); - } else if (stack.is(HexItems.QUENCHED_SHARD)) { - // no one uses the config - evt.addCapability(MEDIA_STATIC_CAP, - provide(stack, HexCapabilities.MEDIA, () -> new CapStaticMediaHolder( - () -> MediaConstants.QUENCHED_SHARD_UNIT, ADMediaHolder.QUENCHED_SHARD_PRIORITY, stack))); - } else if (stack.is(HexBlocks.QUENCHED_ALLAY.asItem())) { - // no one uses the config - evt.addCapability(MEDIA_STATIC_CAP, - provide(stack, HexCapabilities.MEDIA, () -> new CapStaticMediaHolder( - () -> MediaConstants.QUENCHED_BLOCK_UNIT, ADMediaHolder.QUENCHED_ALLAY_PRIORITY, stack))); - } - - if (stack.getItem() instanceof IotaHolderItem holder) { - evt.addCapability(IOTA_STORAGE_CAP, - provide(stack, HexCapabilities.IOTA, () -> new CapItemIotaHolder(holder, stack))); - } else if (stack.is(Items.PUMPKIN_PIE)) { - // haha yes - evt.addCapability(IOTA_STATIC_CAP, provide(stack, HexCapabilities.IOTA, () -> - new CapStaticIotaHolder((s) -> new DoubleIota(Math.PI * s.getCount()), stack))); - } - - if (stack.getItem() instanceof HexHolderItem holder) { - evt.addCapability(HEX_HOLDER_CAP, - provide(stack, HexCapabilities.STORED_HEX, () -> new CapItemHexHolder(holder, stack))); - } - if (stack.getItem() instanceof VariantItem variantItem) { - evt.addCapability(VARIANT_ITEM_CAP, - provide(stack, HexCapabilities.VARIANT_ITEM, () -> new CapItemVariantItem(variantItem, stack))); - } - if (stack.getItem() instanceof PigmentItem pigment) { - evt.addCapability(PIGMENT_CAP, - provide(stack, HexCapabilities.COLOR, () -> new CapItemPigment(pigment, stack))); + public static void registerCapabilities(RegisterCapabilitiesEvent evt) { + // Media holder - items + // Register for ALL items (provider returns null for non-media) to avoid missing items + // from explicit list due to registration order, matching Fabric's predicate-based approach. + ICapabilityProvider mediaProvider = + (stack, ctx) -> { + if (stack.getItem() instanceof MediaHolderItem holder) { + return new CapItemMediaHolder(holder, stack); + } + if (stack.is(HexItems.AMETHYST_DUST)) { + return new CapStaticMediaHolder(HexConfig.common()::dustMediaAmount, ADMediaHolder.AMETHYST_DUST_PRIORITY, stack); + } + if (stack.is(Items.AMETHYST_SHARD)) { + return new CapStaticMediaHolder(HexConfig.common()::shardMediaAmount, ADMediaHolder.AMETHYST_SHARD_PRIORITY, stack); + } + if (stack.is(HexItems.CHARGED_AMETHYST)) { + return new CapStaticMediaHolder(HexConfig.common()::chargedCrystalMediaAmount, ADMediaHolder.CHARGED_AMETHYST_PRIORITY, stack); + } + if (stack.is(HexItems.QUENCHED_SHARD)) { + return new CapStaticMediaHolder(() -> MediaConstants.QUENCHED_SHARD_UNIT, ADMediaHolder.QUENCHED_SHARD_PRIORITY, stack); + } + if (stack.is(HexBlocks.QUENCHED_ALLAY.asItem())) { + return new CapStaticMediaHolder(() -> MediaConstants.QUENCHED_BLOCK_UNIT, ADMediaHolder.QUENCHED_ALLAY_PRIORITY, stack); + } + return null; + }; + for (Item item : BuiltInRegistries.ITEM) { + evt.registerItem(HexCapabilities.MEDIA, mediaProvider, item); } - if (IXplatAbstractions.INSTANCE.isModPresent(HexInterop.Forge.CURIOS_API_ID) - && stack.getItem() instanceof HexBaubleItem) { - evt.addCapability(CURIO_CAP, CuriosApiInterop.curioCap(stack)); + // Iota holder - items + evt.registerItem(HexCapabilities.IOTA, (stack, ctx) -> { + if (stack.getItem() instanceof IotaHolderItem holder) { + return new CapItemIotaHolder(holder, stack); + } + if (stack.is(Items.PUMPKIN_PIE)) { + return new CapStaticIotaHolder((s) -> new DoubleIota(Math.PI * s.getCount()), stack); + } + return null; + }, getIotaHolderItems()); + + // Hex holder - items + evt.registerItem(HexCapabilities.STORED_HEX, (stack, ctx) -> + stack.getItem() instanceof HexHolderItem holder ? new CapItemHexHolder(holder, stack) : null, + getHexHolderItems()); + + // Variant item + evt.registerItem(HexCapabilities.VARIANT_ITEM, (stack, ctx) -> + stack.getItem() instanceof VariantItem v ? new CapItemVariantItem(v, stack) : null, + getVariantItems()); + + // Pigment + evt.registerItem(HexCapabilities.COLOR, (stack, ctx) -> + stack.getItem() instanceof PigmentItem p ? new CapItemPigment(p, stack) : null, + getPigmentItems()); + + // Entity iota holders + evt.registerEntity(HexCapabilities.IOTA_ENTITY, EntityType.ITEM, (entity, ctx) -> + new CapEntityIotaHolder.Wrapper(new ItemDelegatingEntityIotaHolder.ToItemEntity((ItemEntity) entity))); + evt.registerEntity(HexCapabilities.IOTA_ENTITY, EntityType.GLOW_ITEM_FRAME, (entity, ctx) -> + new CapEntityIotaHolder.Wrapper(new ItemDelegatingEntityIotaHolder.ToItemFrame((ItemFrame) entity))); + evt.registerEntity(HexCapabilities.IOTA_ENTITY, EntityType.ITEM_FRAME, (entity, ctx) -> + new CapEntityIotaHolder.Wrapper(new ItemDelegatingEntityIotaHolder.ToItemFrame((ItemFrame) entity))); + evt.registerEntity(HexCapabilities.IOTA_ENTITY, HexEntities.WALL_SCROLL, (entity, ctx) -> + new CapEntityIotaHolder.Wrapper(new ItemDelegatingEntityIotaHolder.ToWallScroll((EntityWallScroll) entity))); + + // Client casting stack - players only (client-side rendering) + evt.registerEntity(HexCapabilities.CLIENT_CASTING_STACK, EntityType.PLAYER, (entity, ctx) -> + new CapClientCastingStack((Player) entity, new ClientCastingStack())); + + // Block entity - impetus item handler + evt.registerBlockEntity(Capabilities.ItemHandler.BLOCK, HexBlockEntities.IMPETUS_REDSTONE_TILE, + (be, ctx) -> new ForgeImpetusCapability((BlockEntityAbstractImpetus) be)); + evt.registerBlockEntity(Capabilities.ItemHandler.BLOCK, HexBlockEntities.IMPETUS_LOOK_TILE, + (be, ctx) -> new ForgeImpetusCapability((BlockEntityAbstractImpetus) be)); + evt.registerBlockEntity(Capabilities.ItemHandler.BLOCK, HexBlockEntities.IMPETUS_RIGHTCLICK_TILE, + (be, ctx) -> new ForgeImpetusCapability((BlockEntityAbstractImpetus) be)); + + // Curios - bauble items + if (IXplatAbstractions.INSTANCE.isModPresent(HexInterop.Forge.CURIOS_API_ID)) { + CuriosApiInterop.registerCurioCapability(evt); } } - public static void attachEntityCaps(AttachCapabilitiesEvent evt) { - var entity = evt.getObject(); - if (entity instanceof ItemEntity item) { - evt.addCapability(IOTA_STORAGE_CAP, wrapItemEntityDelegate(item, - ItemDelegatingEntityIotaHolder.ToItemEntity::new)); - } else if (entity instanceof ItemFrame frame) { - evt.addCapability(IOTA_STORAGE_CAP, wrapItemEntityDelegate(frame, - ItemDelegatingEntityIotaHolder.ToItemFrame::new)); - } else if (entity instanceof EntityWallScroll scroll) { - evt.addCapability(IOTA_STORAGE_CAP, wrapItemEntityDelegate(scroll, - ItemDelegatingEntityIotaHolder.ToWallScroll::new)); - } else if (entity instanceof Player player) { - evt.addCapability(PATTERN_SPIRAL, provide(player, HexCapabilities.CLIENT_CASTING_STACK, - () -> new CapClientCastingStack(player, new ClientCastingStack()))); + private static ItemLike[] getIotaHolderItems() { + List items = new ArrayList<>(); + items.add(Items.PUMPKIN_PIE); + for (Item item : BuiltInRegistries.ITEM) { + if (item instanceof IotaHolderItem) { + items.add(item); + } } + return items.toArray(ItemLike[]::new); } - public static void attachBlockEntityCaps(AttachCapabilitiesEvent evt) { - if (evt.getObject() instanceof BlockEntityAbstractImpetus impetus) { - evt.addCapability(IMPETUS_HANDLER, provide(impetus, ForgeCapabilities.ITEM_HANDLER, - () -> new ForgeImpetusCapability(impetus))); + private static ItemLike[] getHexHolderItems() { + List items = new ArrayList<>(); + for (Item item : BuiltInRegistries.ITEM) { + if (item instanceof HexHolderItem) { + items.add(item); + } } + return items.toArray(ItemLike[]::new); } - // i do not know why we need super here - private static SimpleProvider wrapItemEntityDelegate(E entity, - Function make) { - return provide(entity, HexCapabilities.IOTA, - () -> new CapEntityIotaHolder.Wrapper(make.apply(entity))); - } - - private static SimpleProvider provide(Entity entity, Capability capability, - NonNullSupplier supplier) { - return provide(entity::isRemoved, capability, supplier); - } - - private static SimpleProvider provide(BlockEntity be, Capability capability, - NonNullSupplier supplier) { - return provide(be::isRemoved, capability, supplier); - } - - public static SimpleProvider provide(ItemStack stack, Capability capability, - NonNullSupplier supplier) { - return provide(stack::isEmpty, capability, supplier); - } - - private static SimpleProvider provide(BooleanSupplier invalidated, Capability capability, - NonNullSupplier supplier) { - return new SimpleProvider<>(invalidated, capability, LazyOptional.of(supplier)); - } - - public static ICapabilityProvider makeProvider(Capability cap, U instance) { - LazyOptional lazyInstanceButNotReally = LazyOptional.of(() -> instance); - return new SimpleProvider<>(() -> false, cap, lazyInstanceButNotReally); + private static ItemLike[] getVariantItems() { + List items = new ArrayList<>(); + for (Item item : BuiltInRegistries.ITEM) { + if (item instanceof VariantItem) { + items.add(item); + } + } + return items.toArray(ItemLike[]::new); } - public record SimpleProvider(BooleanSupplier invalidated, - Capability capability, - LazyOptional instance) implements ICapabilityProvider { - - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - if (invalidated.getAsBoolean()) { - return LazyOptional.empty(); + private static ItemLike[] getPigmentItems() { + List items = new ArrayList<>(); + for (Item item : BuiltInRegistries.ITEM) { + if (item instanceof PigmentItem) { + items.add(item); } - - return cap == capability ? instance.cast() : LazyOptional.empty(); } + return items.toArray(ItemLike[]::new); } - } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeImpetusCapability.java b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeImpetusCapability.java index 9da53fa9a5..45d22e2eb8 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeImpetusCapability.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeImpetusCapability.java @@ -2,7 +2,7 @@ import at.petrak.hexcasting.api.casting.circles.BlockEntityAbstractImpetus; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; public record ForgeImpetusCapability(BlockEntityAbstractImpetus impetus) implements IItemHandler { diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/HexCapabilities.java b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/HexCapabilities.java index 9db3e48d0a..88887ea76d 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/HexCapabilities.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/HexCapabilities.java @@ -2,24 +2,30 @@ import at.petrak.hexcasting.api.addldata.*; import at.petrak.hexcasting.api.client.ClientCastingStack; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.capabilities.EntityCapability; +import net.neoforged.neoforge.capabilities.ItemCapability; import java.util.function.Supplier; +import static at.petrak.hexcasting.api.HexAPI.modLoc; + public final class HexCapabilities { - public static final Capability MEDIA = CapabilityManager.get(new CapabilityToken<>() { - }); - public static final Capability IOTA = CapabilityManager.get(new CapabilityToken<>() { - }); - public static final Capability STORED_HEX = CapabilityManager.get(new CapabilityToken<>() { - }); - public static final Capability VARIANT_ITEM = CapabilityManager.get(new CapabilityToken<>() { - }); - public static final Capability COLOR = CapabilityManager.get(new CapabilityToken<>() { - }); - public static final Capability> CLIENT_CASTING_STACK = CapabilityManager.get(new CapabilityToken<>() { - }); + public static final ItemCapability MEDIA = + ItemCapability.createVoid(modLoc("media"), ADMediaHolder.class); + public static final ItemCapability IOTA = + ItemCapability.createVoid(modLoc("iota"), ADIotaHolder.class); + public static final EntityCapability IOTA_ENTITY = + EntityCapability.createVoid(modLoc("iota_entity"), ADIotaHolder.class); + public static final ItemCapability STORED_HEX = + ItemCapability.createVoid(modLoc("stored_hex"), ADHexHolder.class); + public static final ItemCapability VARIANT_ITEM = + ItemCapability.createVoid(modLoc("variant_item"), ADVariantItem.class); + public static final ItemCapability COLOR = + ItemCapability.createVoid(modLoc("pigment"), ADPigment.class); + @SuppressWarnings("unchecked") + public static final EntityCapability, Void> CLIENT_CASTING_STACK = + (EntityCapability, Void>) (Object) EntityCapability.createVoid( + modLoc("client_casting_stack"), Supplier.class); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapClientCastingStack.java b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapClientCastingStack.java index bdba8678ca..ce21392850 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapClientCastingStack.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapClientCastingStack.java @@ -3,9 +3,8 @@ import at.petrak.hexcasting.api.client.ClientCastingStack; import at.petrak.hexcasting.forge.cap.HexCapabilities; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.LogicalSide; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; import java.util.function.Supplier; @@ -16,9 +15,13 @@ public ClientCastingStack get() { } @SubscribeEvent - public static void tickClientPlayer(TickEvent.PlayerTickEvent evt) { - if (evt.side == LogicalSide.CLIENT && !evt.player.isDeadOrDying()) - evt.player.getCapability(HexCapabilities.CLIENT_CASTING_STACK).resolve() - .ifPresent(CastingStack -> CastingStack.get().tick()); + public static void tickClientPlayer(PlayerTickEvent.Post evt) { + var player = evt.getEntity(); + if (player.level().isClientSide() && !player.isDeadOrDying()) { + var cap = player.getCapability(HexCapabilities.CLIENT_CASTING_STACK); + if (cap != null) { + cap.get().tick(); + } + } } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexConditionsBuilder.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexConditionsBuilder.java index 93b1cfe529..af614bee93 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexConditionsBuilder.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexConditionsBuilder.java @@ -1,14 +1,14 @@ package at.petrak.hexcasting.forge.datagen; import at.petrak.hexcasting.datagen.IXplatConditionsBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import net.minecraft.advancements.CriterionTriggerInstance; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; -import net.minecraftforge.common.crafting.ConditionalRecipe; -import net.minecraftforge.common.crafting.conditions.ICondition; -import net.minecraftforge.common.crafting.conditions.IConditionBuilder; +import net.minecraft.world.item.crafting.RecipeSerializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,8 +16,12 @@ import java.util.List; import java.util.function.Consumer; -public class ForgeHexConditionsBuilder implements IXplatConditionsBuilder, IConditionBuilder { - private final List conditions = new ArrayList<>(); +/** + * Injects neoforge:conditions into recipe JSON, matching the NeoForge 1.21.1 + * data load conditions format. Replaces the removed ConditionalRecipe API. + */ +public class ForgeHexConditionsBuilder implements IXplatConditionsBuilder { + private final List conditionJsons = new ArrayList<>(); private final RecipeBuilder parent; public ForgeHexConditionsBuilder(RecipeBuilder parent) { @@ -26,13 +30,22 @@ public ForgeHexConditionsBuilder(RecipeBuilder parent) { @Override public IXplatConditionsBuilder whenModLoaded(String modid) { - conditions.add(modLoaded(modid)); + JsonObject json = new JsonObject(); + json.addProperty("type", "neoforge:mod_loaded"); + json.addProperty("modid", modid); + conditionJsons.add(json); return this; } @Override public IXplatConditionsBuilder whenModMissing(String modid) { - conditions.add(not(modLoaded(modid))); + JsonObject inner = new JsonObject(); + inner.addProperty("type", "neoforge:mod_loaded"); + inner.addProperty("modid", modid); + JsonObject json = new JsonObject(); + json.addProperty("type", "neoforge:not"); + json.add("value", inner); + conditionJsons.add(json); return this; } @@ -54,11 +67,42 @@ public IXplatConditionsBuilder whenModMissing(String modid) { @Override public void save(@NotNull Consumer consumer, @NotNull ResourceLocation resourceLocation) { - var conditionalBuilder = ConditionalRecipe.builder(); - for (ICondition condition : conditions) { - conditionalBuilder.addCondition(condition); - } - conditionalBuilder.addRecipe(recipeConsumer -> parent.save(recipeConsumer, resourceLocation)) - .build(consumer, resourceLocation); + Consumer withConditions = json -> consumer.accept(new FinishedRecipe() { + @Override + public void serializeRecipeData(@NotNull JsonObject jsonObject) { + json.serializeRecipeData(jsonObject); + if (!conditionJsons.isEmpty()) { + JsonArray conditions = new JsonArray(); + for (JsonObject cond : conditionJsons) { + conditions.add(cond); + } + jsonObject.add("neoforge:conditions", conditions); + } + } + + @Override + public ResourceLocation getId() { + return json.getId(); + } + + @Override + public RecipeSerializer getType() { + return json.getType(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return json.serializeAdvancement(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return json.getAdvancementId(); + } + }); + + parent.save(withConditions, resourceLocation); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexDataGenerators.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexDataGenerators.java index c5ed351ea7..0920246190 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexDataGenerators.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexDataGenerators.java @@ -28,12 +28,12 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.ToolActions; -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.data.event.GatherDataEvent; +import net.neoforged.bus.api.SubscribeEvent; import java.util.EnumMap; import java.util.List; @@ -162,7 +162,7 @@ public Ingredient stick() { @Override public Ingredient whenModIngredient(Ingredient defaultIngredient, String modid, Ingredient modIngredient) { - return ForgeModConditionalIngredient.of(defaultIngredient, modid, modIngredient); + return ForgeModConditionalIngredient.of(defaultIngredient, modid, modIngredient).toVanilla(); } // https://github.com/vectorwing/FarmersDelight/blob/1.18.2/src/generated/resources/data/farmersdelight/recipes/cutting/amethyst_block.json @@ -171,7 +171,7 @@ public FarmersDelightToolIngredient axeStrip() { return () -> { JsonObject object = new JsonObject(); object.addProperty("type", "farmersdelight:tool_action"); - object.addProperty("action", ToolActions.AXE_STRIP.name()); + object.addProperty("action", ItemAbilities.AXE_STRIP.name()); return object; }; } @@ -181,7 +181,7 @@ public FarmersDelightToolIngredient axeDig() { return () -> { JsonObject object = new JsonObject(); object.addProperty("type", "farmersdelight:tool_action"); - object.addProperty("action", ToolActions.AXE_DIG.name()); + object.addProperty("action", ItemAbilities.AXE_DIG.name()); return object; }; } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java index 521996ab29..b3cfd8a0f2 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/ForgeHexLootModGen.java @@ -10,8 +10,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.data.GlobalLootModifierProvider; -import net.minecraftforge.common.loot.LootTableIdCondition; +import net.neoforged.neoforge.common.data.GlobalLootModifierProvider; +import net.neoforged.neoforge.common.loot.LootTableIdCondition; import static at.petrak.hexcasting.api.HexAPI.modLoc; diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/TagsProviderEFHSetter.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/TagsProviderEFHSetter.java deleted file mode 100644 index ddda7d2966..0000000000 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/TagsProviderEFHSetter.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.petrak.hexcasting.forge.datagen; - -import net.minecraftforge.common.data.ExistingFileHelper; - -public interface TagsProviderEFHSetter { - void setEFH(ExistingFileHelper efh); -} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexBlockStatesAndModels.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexBlockStatesAndModels.java index 1ed69ec340..a3c29ddb18 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexBlockStatesAndModels.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexBlockStatesAndModels.java @@ -14,12 +14,12 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraftforge.client.model.generators.BlockModelBuilder; -import net.minecraftforge.client.model.generators.ConfiguredModel; -import net.minecraftforge.client.model.generators.ModelBuilder; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.client.model.generators.BlockModelBuilder; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; +import net.neoforged.neoforge.client.model.generators.ModelBuilder; +import net.neoforged.neoforge.common.data.ExistingFileHelper; -import static net.minecraftforge.client.model.generators.ModelProvider.BLOCK_FOLDER; +import static net.neoforged.neoforge.client.model.generators.ModelProvider.BLOCK_FOLDER; public class HexBlockStatesAndModels extends PaucalBlockStateAndModelProvider { public HexBlockStatesAndModels(PackOutput output, ExistingFileHelper exFileHelper) { diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index 60985fb338..46e3a4ad6d 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -22,9 +22,9 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraft.core.registries.BuiltInRegistries; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import java.util.Arrays; import java.util.Objects; @@ -40,11 +40,11 @@ public HexItemModels(PackOutput output, ExistingFileHelper existingFileHelper) { private static final Integer[] PACKAGED_SPELL_HANDHELD_VARIANTS = {5}; private static String getPath(Item item) { - return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item)).getPath(); + return Objects.requireNonNull(BuiltInRegistries.ITEM.getKey(item)).location().getPath(); } private static String getPath(Block block) { - return Objects.requireNonNull(ForgeRegistries.BLOCKS.getKey(block)).getPath(); + return Objects.requireNonNull(BuiltInRegistries.BLOCK.getKey(block)).location().getPath(); } @Override diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java index dfb750c35a..00064c330a 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java @@ -3,22 +3,25 @@ import at.petrak.hexcasting.api.misc.DiscoveryHandlers; import at.petrak.hexcasting.common.items.HexBaubleItem; import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker; -import at.petrak.hexcasting.forge.cap.ForgeCapabilityHandler; +import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.interop.HexInterop; -import com.google.common.collect.Multimap; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fml.InterModComms; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.neoforged.fml.InterModComms; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import top.theillusivec4.curios.api.CuriosCapability; import top.theillusivec4.curios.api.SlotContext; import top.theillusivec4.curios.api.SlotTypeMessage; import top.theillusivec4.curios.api.SlotTypePreset; import top.theillusivec4.curios.api.type.capability.ICurio; +import com.google.common.collect.Multimap; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ItemStack; + import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; @@ -42,33 +45,39 @@ public ItemStack getStack() { } @Override - public Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid) { + public Multimap, AttributeModifier> getAttributeModifiers(SlotContext slotContext, UUID uuid) { var map = ICurio.super.getAttributeModifiers(slotContext, uuid); - map.putAll(this.bauble.getHexBaubleAttrs(this.stack)); + for (var entry : this.bauble.getHexBaubleAttrs(this.stack).entries()) { + var key = BuiltInRegistries.ATTRIBUTE.getResourceKey(entry.getKey()); + key.ifPresent(k -> map.put(BuiltInRegistries.ATTRIBUTE.getHolderOrThrow(k), entry.getValue())); + } return map; } } - public static ICapabilityProvider curioCap(ItemStack stack) { - return ForgeCapabilityHandler.makeProvider(CuriosCapability.ITEM, new Wrapper(stack)); + public static void registerCurioCapability(RegisterCapabilitiesEvent evt) { + evt.registerItem(CuriosCapability.ITEM, (stack, ctx) -> + stack.getItem() instanceof HexBaubleItem ? new Wrapper(stack) : null, + HexItems.SCRYING_LENS); } - public static void init() { DiscoveryHandlers.addDebugItemDiscoverer((player, type) -> { AtomicReference result = new AtomicReference<>(ItemStack.EMPTY); - player.getCapability(CuriosCapability.INVENTORY).ifPresent(handler -> { + var handler = player.getCapability(CuriosCapability.INVENTORY); + if (handler != null) { + search: for (var stacksHandler : handler.getCurios().values()) { var stacks = stacksHandler.getStacks(); for (int i = 0; i < stacks.getSlots(); i++) { var stack = stacks.getStackInSlot(i); if (ItemCreativeUnlocker.isDebug(stack, type)) { result.set(stack); - return; + break search; } } } - }); + } return result.get(); }); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java index 3ec7edd483..675520b67a 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java @@ -8,9 +8,9 @@ import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.client.model.geom.builders.LayerDefinition; import net.minecraft.client.model.geom.builders.MeshDefinition; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.EntityRenderersEvent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; import top.theillusivec4.curios.api.client.CuriosRendererRegistry; @OnlyIn(Dist.CLIENT) diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java index 38f5ff065f..a9f590d950 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java @@ -19,7 +19,7 @@ import top.theillusivec4.curios.api.client.ICurioRenderer; public class LensCurioRenderer implements ICurioRenderer { - public static final ModelLayerLocation LAYER = new ModelLayerLocation(new ResourceLocation(HexAPI.MOD_ID, "lens"), "lens"); + public static final ModelLayerLocation LAYER = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(HexAPI.MOD_ID, "lens"), "lens"); private final HumanoidModel model; diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/BrainsweepRecipeCategory.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/BrainsweepRecipeCategory.java index 6dddb8015a..7ac37293b6 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/BrainsweepRecipeCategory.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/BrainsweepRecipeCategory.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.common.recipe.BrainsweepRecipe; import com.mojang.blaze3d.systems.RenderSystem; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.builder.ITooltipBuilder; import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.drawable.IDrawableStatic; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; @@ -18,13 +19,10 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; -import java.util.Collections; -import java.util.List; - import static at.petrak.hexcasting.api.HexAPI.modLoc; import static at.petrak.hexcasting.client.render.RenderLib.renderEntity; @@ -63,15 +61,12 @@ IDrawable getIcon() { } @Override - public @NotNull - List getTooltipStrings(@NotNull BrainsweepRecipe recipe, + public void getTooltip(@NotNull ITooltipBuilder tooltip, @NotNull BrainsweepRecipe recipe, @NotNull IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { if (37 <= mouseX && mouseX <= 37 + 26 && 19 <= mouseY && mouseY <= 19 + 48) { Minecraft mc = Minecraft.getInstance(); - return recipe.entityIn().getTooltip(mc.options.advancedItemTooltips); + tooltip.addAll(recipe.entityIn().getTooltip(mc.options.advancedItemTooltips)); } - - return Collections.emptyList(); } @Override diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java index 84ab9bab31..14023a25a0 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java @@ -15,8 +15,8 @@ import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; import static at.petrak.hexcasting.api.HexAPI.modLoc; diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java index 32572ba10c..f16ad99c72 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java @@ -17,6 +17,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; @@ -56,8 +57,11 @@ public void registerCategories(IRecipeCategoryRegistration registration) { public void registerRecipes(@NotNull IRecipeRegistration registration) { Level level = Minecraft.getInstance().level; if (level != null) { - registration.addRecipes(BRAINSWEEPING, - level.getRecipeManager().getAllRecipesFor(HexRecipeStuffRegistry.BRAINSWEEP_TYPE)); + var brainsweepRecipes = level.getRecipeManager().getAllRecipesFor(HexRecipeStuffRegistry.BRAINSWEEP_TYPE) + .stream() + .map(RecipeHolder::value) + .toList(); + registration.addRecipes(BRAINSWEEPING, brainsweepRecipes); } if (PhialRecipeStackBuilder.shouldAddRecipe()) { diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java index 23a4272a4e..552e4947a0 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java @@ -14,8 +14,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; import static at.petrak.hexcasting.api.HexAPI.modLoc; diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexArgumentTypeRegistry.java b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexArgumentTypeRegistry.java index 4a3450372a..7aff9e1d6c 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexArgumentTypeRegistry.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexArgumentTypeRegistry.java @@ -3,33 +3,33 @@ import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.common.command.PatternResLocArgument; import com.mojang.brigadier.arguments.ArgumentType; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.commands.synchronization.SingletonArgumentInfo; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; -// ArgumentTypeInfos.java public class ForgeHexArgumentTypeRegistry { public static final DeferredRegister> ARGUMENT_TYPES = DeferredRegister.create( - ForgeRegistries.COMMAND_ARGUMENT_TYPES, HexAPI.MOD_ID); + BuiltInRegistries.COMMAND_ARGUMENT_TYPE, HexAPI.MOD_ID); // how fucking ergonomic - public static final RegistryObject.Template>> + public static final DeferredHolder, + ArgumentTypeInfo.Template>> PATTERN_RESLOC = register(PatternResLocArgument.class, "pattern", SingletonArgumentInfo.contextFree(PatternResLocArgument::id) ); - private static , T extends ArgumentTypeInfo.Template, I extends ArgumentTypeInfo> - RegistryObject> register( + @SuppressWarnings("unchecked") + private static , T extends ArgumentTypeInfo.Template> + DeferredHolder, ArgumentTypeInfo> register( Class clazz, String name, ArgumentTypeInfo ati) { - var robj = ARGUMENT_TYPES.register(name, () -> ati); + var holder = ARGUMENT_TYPES.register(name, () -> ati); ArgumentTypeInfos.registerByClass(clazz, ati); - return robj; + return (DeferredHolder, ArgumentTypeInfo>) (Object) holder; } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexIngredientTypes.java b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexIngredientTypes.java new file mode 100644 index 0000000000..74ab66518b --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexIngredientTypes.java @@ -0,0 +1,27 @@ +package at.petrak.hexcasting.forge.lib; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.forge.recipe.ForgeModConditionalIngredient; +import at.petrak.hexcasting.forge.recipe.ForgeUnsealedIngredient; +import net.neoforged.neoforge.common.crafting.IngredientType; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +import java.util.function.Supplier; + +public class ForgeHexIngredientTypes { + public static final DeferredRegister> INGREDIENT_TYPES = + DeferredRegister.create(NeoForgeRegistries.Keys.INGREDIENT_TYPES, HexAPI.MOD_ID); + + public static final Supplier> UNSEALED = + INGREDIENT_TYPES.register("unsealed", () -> new IngredientType<>( + ForgeUnsealedIngredient.CODEC, + ForgeUnsealedIngredient.STREAM_CODEC + )); + + public static final Supplier> MOD_CONDITIONAL = + INGREDIENT_TYPES.register("mod_conditional", () -> new IngredientType<>( + ForgeModConditionalIngredient.CODEC, + ForgeModConditionalIngredient.STREAM_CODEC + )); +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java index 7581f6aaab..6df9492d9b 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/lib/ForgeHexLootMods.java @@ -5,22 +5,22 @@ import at.petrak.hexcasting.forge.loot.ForgeHexLoreLootMod; import at.petrak.hexcasting.forge.loot.ForgeHexScrollLootMod; import at.petrak.hexcasting.forge.loot.ForgeHexCypherLootMod; -import com.mojang.serialization.Codec; -import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import com.mojang.serialization.MapCodec; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; public class ForgeHexLootMods { - public static final DeferredRegister> REGISTRY = DeferredRegister.create( - ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, HexAPI.MOD_ID); + public static final DeferredRegister> REGISTRY = DeferredRegister.create( + NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, HexAPI.MOD_ID); - public static final RegistryObject> INJECT_SCROLLS = REGISTRY.register( - "inject_scrolls", ForgeHexScrollLootMod.CODEC); - public static final RegistryObject> INJECT_LORE = REGISTRY.register( - "inject_lore", ForgeHexLoreLootMod.CODEC); - public static final RegistryObject> INJECT_CYPHERS = REGISTRY.register( - "inject_cyphers", ForgeHexCypherLootMod.CODEC); - public static final RegistryObject> AMETHYST = REGISTRY.register( - "amethyst_cluster", ForgeHexAmethystLootMod.CODEC); + public static final DeferredHolder, MapCodec> INJECT_SCROLLS = REGISTRY.register( + "inject_scrolls", () -> ForgeHexScrollLootMod.CODEC.get()); + public static final DeferredHolder, MapCodec> INJECT_LORE = REGISTRY.register( + "inject_lore", () -> ForgeHexLoreLootMod.CODEC.get()); + public static final DeferredHolder, MapCodec> INJECT_CYPHERS = REGISTRY.register( + "inject_cyphers", () -> ForgeHexCypherLootMod.CODEC.get()); + public static final DeferredHolder, MapCodec> AMETHYST = REGISTRY.register( + "amethyst_cluster", () -> ForgeHexAmethystLootMod.CODEC.get()); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexAmethystLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexAmethystLootMod.java index 671e9cec5b..c15ffc7259 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexAmethystLootMod.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexAmethystLootMod.java @@ -1,23 +1,25 @@ package at.petrak.hexcasting.forge.loot; +import com.mojang.serialization.Codec; import at.petrak.hexcasting.common.loot.AmethystReducerFunc; import at.petrak.hexcasting.common.loot.HexLootHandler; import at.petrak.hexcasting.forge.lib.ForgeHexLootMods; import com.google.common.base.Suppliers; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public class ForgeHexAmethystLootMod extends LootModifier { - public static final Supplier> CODEC = - Suppliers.memoize(() -> RecordCodecBuilder.create( + public static final Supplier> CODEC = + Suppliers.memoize(() -> RecordCodecBuilder.mapCodec( inst -> codecStart(inst).and( Codec.DOUBLE.fieldOf("shardDelta").forGetter(it -> it.shardDelta) ).apply(inst, ForgeHexAmethystLootMod::new) @@ -33,8 +35,15 @@ public ForgeHexAmethystLootMod(LootItemCondition[] conditionsIn, double shardDel @Override protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { - var injectPool = context.getResolver().getLootTable(HexLootHandler.TABLE_INJECT_AMETHYST_CLUSTER); - injectPool.getRandomItemsRaw(context, generatedLoot::add); + var injectPool = context.getResolver() + .lookup(net.minecraft.world.level.storage.loot.LootDataType.TABLE.registryKey()) + .orElseThrow() + .get(net.minecraft.resources.ResourceKey.create( + net.minecraft.world.level.storage.loot.LootDataType.TABLE.registryKey(), + HexLootHandler.TABLE_INJECT_AMETHYST_CLUSTER)) + .orElseThrow() + .value(); + injectPool.getRandomItems(context, generatedLoot::add); for (var stack : generatedLoot) { AmethystReducerFunc.doStatic(stack, context, this.shardDelta); @@ -44,7 +53,7 @@ public ForgeHexAmethystLootMod(LootItemCondition[] conditionsIn, double shardDel } @Override - public Codec codec() { + public MapCodec codec() { return ForgeHexLootMods.AMETHYST.get(); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java index 385bf4a64e..50760140df 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexCypherLootMod.java @@ -1,23 +1,25 @@ package at.petrak.hexcasting.forge.loot; +import com.mojang.serialization.Codec; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.loot.AddHexToAncientCypherFunc; import at.petrak.hexcasting.forge.lib.ForgeHexLootMods; import com.google.common.base.Suppliers; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public class ForgeHexCypherLootMod extends LootModifier { - public static final Supplier> CODEC = - Suppliers.memoize(() -> RecordCodecBuilder.create( + public static final Supplier> CODEC = + Suppliers.memoize(() -> RecordCodecBuilder.mapCodec( inst -> codecStart(inst).and( Codec.DOUBLE.fieldOf("chance").forGetter(it -> it.chance) ).apply(inst, ForgeHexCypherLootMod::new) @@ -42,7 +44,7 @@ public ForgeHexCypherLootMod(LootItemCondition[] conditionsIn, double chance) { } @Override - public Codec codec() { + public MapCodec codec() { return ForgeHexLootMods.INJECT_CYPHERS.get(); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexLoreLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexLoreLootMod.java index e5de13a237..3d67585054 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexLoreLootMod.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexLoreLootMod.java @@ -1,22 +1,24 @@ package at.petrak.hexcasting.forge.loot; +import com.mojang.serialization.Codec; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.forge.lib.ForgeHexLootMods; import com.google.common.base.Suppliers; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public class ForgeHexLoreLootMod extends LootModifier { - public static final Supplier> CODEC = - Suppliers.memoize(() -> RecordCodecBuilder.create( + public static final Supplier> CODEC = + Suppliers.memoize(() -> RecordCodecBuilder.mapCodec( inst -> codecStart(inst).and( Codec.DOUBLE.fieldOf("chance").forGetter(it -> it.chance) ).apply(inst, ForgeHexLoreLootMod::new) @@ -39,7 +41,7 @@ public ForgeHexLoreLootMod(LootItemCondition[] conditionsIn, double chance) { } @Override - public Codec codec() { + public MapCodec codec() { return ForgeHexLootMods.INJECT_LORE.get(); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java index 114a19b2b5..e0de62cbb1 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java @@ -1,25 +1,26 @@ package at.petrak.hexcasting.forge.loot; +import com.mojang.serialization.Codec; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; import at.petrak.hexcasting.common.loot.HexLootHandler; import at.petrak.hexcasting.forge.lib.ForgeHexLootMods; import com.google.common.base.Suppliers; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public class ForgeHexScrollLootMod extends LootModifier { - public static final Supplier> CODEC = - Suppliers.memoize(() -> RecordCodecBuilder.create( + public static final Supplier> CODEC = + Suppliers.memoize(() -> RecordCodecBuilder.mapCodec( inst -> codecStart(inst).and( Codec.INT.fieldOf("countRange").forGetter(it -> it.countRange) ).apply(inst, ForgeHexScrollLootMod::new) @@ -45,7 +46,7 @@ public ForgeHexScrollLootMod(LootItemCondition[] conditionsIn, int countRange) { } @Override - public Codec codec() { + public MapCodec codec() { return ForgeHexLootMods.INJECT_SCROLLS.get(); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeAccessorBuiltInRegistries.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeAccessorBuiltInRegistries.java index b086d8714d..8b73c83eba 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeAccessorBuiltInRegistries.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeAccessorBuiltInRegistries.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(BuiltInRegistries.class) +@Mixin(value = BuiltInRegistries.class, remap = false) public interface ForgeAccessorBuiltInRegistries { @Invoker("registerDefaulted") static DefaultedRegistry hex$registerDefaulted(ResourceKey> registryName, diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinBlockColors.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinBlockColors.java deleted file mode 100644 index 04983c5019..0000000000 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinBlockColors.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.petrak.hexcasting.forge.mixin; - -import at.petrak.hexcasting.forge.ForgeHexClientInitializer; -import net.minecraft.client.color.block.BlockColors; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(BlockColors.class) -public class ForgeMixinBlockColors { - @Inject(method = "createDefault", at = @At("RETURN")) - private static void hex$onCreateDefault(CallbackInfoReturnable info) { - ForgeHexClientInitializer.GLOBAL_BLOCK_COLORS = info.getReturnValue(); - } -} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinCustomPacketPayload.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinCustomPacketPayload.java new file mode 100644 index 0000000000..ab1f1327e5 --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinCustomPacketPayload.java @@ -0,0 +1,60 @@ +package at.petrak.hexcasting.forge.mixin; + +import at.petrak.hexcasting.common.msgs.*; +import at.petrak.hexcasting.forge.network.*; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Map; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +/** + * The encoder uses CustomPacketPayload$1.findCodec(id), which looks up id in a pre-built idToType map. + * When our hex payloads aren't in that map, it falls back to DiscardedPayload codec → ClassCastException. + * This mixin returns our real codecs for hexcasting payload IDs so encoding succeeds. + */ +@Mixin(targets = "net.minecraft.network.protocol.common.custom.CustomPacketPayload$1", remap = true) +public abstract class ForgeMixinCustomPacketPayload { + + private static final Map> HEX_CODECS = Map.ofEntries( + Map.entry(modLoc("pat_sc"), MsgNewSpellPatternS2C.STREAM_CODEC), + Map.entry(modLoc("pat_cs"), MsgNewSpellPatternC2S.STREAM_CODEC), + Map.entry(modLoc("scroll"), MsgShiftScrollC2S.STREAM_CODEC), + Map.entry(modLoc("sntnl"), MsgSentinelStatusUpdateAck.STREAM_CODEC), + Map.entry(modLoc("color"), MsgPigmentUpdateAck.STREAM_CODEC), + Map.entry(modLoc("altiora"), MsgAltioraUpdateAck.STREAM_CODEC), + Map.entry(modLoc("cprtcl"), MsgCastParticleS2C.STREAM_CODEC), + Map.entry(modLoc("cgui"), MsgOpenSpellGuiS2C.STREAM_CODEC), + Map.entry(modLoc("beep"), MsgBeepS2C.STREAM_CODEC), + Map.entry(modLoc("sweep"), MsgBrainsweepAck.STREAM_CODEC), + Map.entry(modLoc("wallscr"), MsgNewWallScrollS2C.STREAM_CODEC), + Map.entry(modLoc("redoscroll"), MsgRecalcWallScrollDisplayS2C.STREAM_CODEC), + Map.entry(modLoc("spi_pats_sc"), MsgNewSpiralPatternsS2C.STREAM_CODEC), + Map.entry(modLoc("clr_spi_pats_sc"), MsgClearSpiralPatternsS2C.STREAM_CODEC) + ); + + /** + * Injected at HEAD of findCodec(ResourceLocation). When the payload id is hexcasting and we have + * a codec, return it so the encoder uses our codec instead of falling back to DiscardedPayload. + */ + @Inject( + method = "findCodec(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/network/codec/StreamCodec;", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private void hexcasting$findCodec(ResourceLocation id, CallbackInfoReturnable cir) { + StreamCodec codec = HEX_CODECS.get(id); + if (codec != null) { + cir.setReturnValue(codec); + cir.cancel(); + } + } +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinItemColors.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinItemColors.java deleted file mode 100644 index 2ef14ac4de..0000000000 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinItemColors.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.petrak.hexcasting.forge.mixin; - -import at.petrak.hexcasting.forge.ForgeHexClientInitializer; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.item.ItemColors; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(ItemColors.class) -public class ForgeMixinItemColors { - @Inject(method = "createDefault", at = @At("RETURN")) - private static void hex$onCreateDefault(BlockColors blockColors, CallbackInfoReturnable info) { - ForgeHexClientInitializer.GLOBAL_ITEM_COLORS = info.getReturnValue(); - } -} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinNetworkRegistry.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinNetworkRegistry.java new file mode 100644 index 0000000000..a5047bfd3a --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinNetworkRegistry.java @@ -0,0 +1,278 @@ +package at.petrak.hexcasting.forge.mixin; + +import at.petrak.hexcasting.common.msgs.*; +import at.petrak.hexcasting.forge.network.*; +import com.google.common.collect.ImmutableSet; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.ClientCommonPacketListener; +import net.minecraft.network.protocol.common.ServerCommonPacketListener; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.common.extensions.ICommonPacketListener; +import net.neoforged.neoforge.network.registration.NetworkPayloadSetup; +import net.neoforged.neoforge.network.registration.NetworkRegistry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.lang.reflect.Field; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; + +import net.neoforged.neoforge.network.registration.PayloadRegistration; + +import static at.petrak.hexcasting.api.HexAPI.MOD_ID; +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +/** + * Bypasses NeoForge 21.1.x payload direction checks for hex casting client-bound packets. + * Also ensures getCodec returns our codec when the encoder looks it up (avoids ClassCastException to DiscardedPayload). + * When handleModdedPayload's lookup returns null (client-side play setup lacks hex channels), we handle hex payloads directly. + */ +@Mixin(value = NetworkRegistry.class, remap = false) +public class ForgeMixinNetworkRegistry { + + private static final Set HEX_PLAY_PAYLOAD_IDS = Set.of( + modLoc("pat_sc"), modLoc("sntnl"), modLoc("color"), modLoc("altiora"), + modLoc("cprtcl"), modLoc("cgui"), modLoc("beep"), modLoc("sweep"), + modLoc("wallscr"), modLoc("redoscroll"), modLoc("spi_pats_sc"), modLoc("clr_spi_pats_sc") + ); + + /** Client-to-server payload IDs (must be allowed when client sends). */ + private static final Set HEX_C2S_PAYLOAD_IDS = Set.of( + modLoc("pat_cs"), modLoc("scroll") + ); + + /** Handlers for hex client-bound payloads when NeoForge lookup returns null (e.g. client play setup). */ + private static final Map> HEX_CLIENT_HANDLERS = Map.ofEntries( + Map.entry(modLoc("pat_sc"), p -> MsgNewSpellPatternS2C.handle((MsgNewSpellPatternS2C) p)), + Map.entry(modLoc("sntnl"), p -> MsgSentinelStatusUpdateAck.handle((MsgSentinelStatusUpdateAck) p)), + Map.entry(modLoc("color"), p -> MsgPigmentUpdateAck.handle((MsgPigmentUpdateAck) p)), + Map.entry(modLoc("altiora"), p -> MsgAltioraUpdateAck.handle((MsgAltioraUpdateAck) p)), + Map.entry(modLoc("cprtcl"), p -> MsgCastParticleS2C.handle((MsgCastParticleS2C) p)), + Map.entry(modLoc("cgui"), p -> MsgOpenSpellGuiS2C.handle((MsgOpenSpellGuiS2C) p)), + Map.entry(modLoc("beep"), p -> MsgBeepS2C.handle((MsgBeepS2C) p)), + Map.entry(modLoc("sweep"), p -> MsgBrainsweepAck.handle((MsgBrainsweepAck) p)), + Map.entry(modLoc("wallscr"), p -> MsgNewWallScrollS2C.handle((MsgNewWallScrollS2C) p)), + Map.entry(modLoc("redoscroll"), p -> MsgRecalcWallScrollDisplayS2C.handle((MsgRecalcWallScrollDisplayS2C) p)), + Map.entry(modLoc("spi_pats_sc"), p -> MsgNewSpiralPatternsS2C.handle((MsgNewSpiralPatternsS2C) p)), + Map.entry(modLoc("clr_spi_pats_sc"), p -> MsgClearSpiralPatternsS2C.handle((MsgClearSpiralPatternsS2C) p)) + ); + + @Inject( + method = "checkPacket(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/protocol/common/ServerCommonPacketListener;)V", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$bypassServerPacketCheck(Packet packet, ServerCommonPacketListener listener, CallbackInfo ci) { + if (packet instanceof ClientboundCustomPayloadPacket cp) { + if (MOD_ID.equals(cp.payload().type().id().getNamespace())) { + ci.cancel(); + } + } else if (packet instanceof ServerboundCustomPayloadPacket cp) { + if (HEX_C2S_PAYLOAD_IDS.contains(cp.payload().type().id())) { + ci.cancel(); + } + } + } + + @Inject( + method = "checkPacket(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/protocol/common/ClientCommonPacketListener;)V", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$bypassPacketCheck(Packet packet, ClientCommonPacketListener listener, CallbackInfo ci) { + if (packet instanceof ClientboundCustomPayloadPacket cp) { + if (MOD_ID.equals(cp.payload().type().id().getNamespace())) { + ci.cancel(); + } + } else if (packet instanceof ServerboundCustomPayloadPacket cp) { + if (HEX_C2S_PAYLOAD_IDS.contains(cp.payload().type().id())) { + ci.cancel(); + } + } + } + + @Inject( + method = "hasChannel(Lnet/neoforged/neoforge/common/extensions/ICommonPacketListener;Lnet/minecraft/resources/ResourceLocation;)Z", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$hasHexChannelListener(ICommonPacketListener listener, ResourceLocation id, CallbackInfoReturnable cir) { + if (HEX_PLAY_PAYLOAD_IDS.contains(id) || HEX_C2S_PAYLOAD_IDS.contains(id)) { + cir.setReturnValue(true); + cir.cancel(); + } + } + + @Inject( + method = "hasChannel(Lnet/minecraft/network/Connection;Lnet/minecraft/network/ConnectionProtocol;Lnet/minecraft/resources/ResourceLocation;)Z", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$hasHexChannelConnection(Connection connection, ConnectionProtocol protocol, ResourceLocation id, CallbackInfoReturnable cir) { + if (HEX_PLAY_PAYLOAD_IDS.contains(id) || HEX_C2S_PAYLOAD_IDS.contains(id)) { + cir.setReturnValue(true); + cir.cancel(); + } + } + + /** handleModdedPayload uses hasAdhocChannel (not hasChannel) when setup.getChannel returns null. */ + @Inject( + method = "hasAdhocChannel(Lnet/minecraft/network/ConnectionProtocol;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/network/protocol/PacketFlow;)Z", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$hasAdhocHexChannel(ConnectionProtocol protocol, ResourceLocation id, PacketFlow flow, CallbackInfoReturnable cir) { + if (flow == PacketFlow.CLIENTBOUND && HEX_PLAY_PAYLOAD_IDS.contains(id)) { + cir.setReturnValue(true); + cir.cancel(); + } else if (flow == PacketFlow.SERVERBOUND && HEX_C2S_PAYLOAD_IDS.contains(id)) { + cir.setReturnValue(true); + cir.cancel(); + } + } + + /** + * When handleModdedPayload runs, the client's connection setup often lacks hex play channels (they're not + * negotiated). Dispatch hex payloads directly here so we never hit the "no registration" disconnect. + */ + @Inject( + method = "handleModdedPayload(Lnet/minecraft/network/protocol/common/ClientCommonPacketListener;Lnet/minecraft/network/protocol/common/ClientboundCustomPayloadPacket;)V", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$handleHexPayloadDirectly(ClientCommonPacketListener listener, ClientboundCustomPayloadPacket packet, CallbackInfo ci) { + var payload = packet.payload(); + var id = payload.type().id(); + var handler = HEX_CLIENT_HANDLERS.get(id); + if (handler != null) { + handler.accept(payload); + ci.cancel(); + } + } + + /** + * When handleModdedPayload runs on server, the registration lookup can return null for hex C2S payloads. + * Intercept and dispatch directly. + */ + @Inject( + method = "handleModdedPayload(Lnet/minecraft/network/protocol/common/ServerCommonPacketListener;Lnet/minecraft/network/protocol/common/ServerboundCustomPayloadPacket;)V", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void hexcasting$handleHexServerPayloadDirectly( + ServerCommonPacketListener listener, + ServerboundCustomPayloadPacket packet, + CallbackInfo ci + ) { + var payload = packet.payload(); + var id = payload.type().id(); + if (!HEX_C2S_PAYLOAD_IDS.contains(id)) return; + if (!(listener instanceof ServerGamePacketListenerImpl gameListener)) return; + var player = gameListener.player; + var server = player.getServer(); + if (server == null) return; + if (id.equals(modLoc("pat_cs"))) { + ((MsgNewSpellPatternC2S) payload).handle(server, player); + ci.cancel(); + } else if (id.equals(modLoc("scroll"))) { + ((MsgShiftScrollC2S) payload).handle(server, player); + ci.cancel(); + } + } + + /** When handleModdedPayload's registration Map.get returns null for hex payloads, fallback to play map. */ + @Redirect( + method = "handleModdedPayload(Lnet/minecraft/network/protocol/common/ClientCommonPacketListener;Lnet/minecraft/network/protocol/common/ClientboundCustomPayloadPacket;)V", + at = @At(value = "INVOKE", target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1), + remap = false + ) + private static Object hexcasting$fallbackPayloadRegistration( + Map map, + Object key, + ClientCommonPacketListener listener, + ClientboundCustomPayloadPacket packet + ) { + Object result = map.get(key); + if (result != null) return result; + if (!(key instanceof ResourceLocation id) || !HEX_PLAY_PAYLOAD_IDS.contains(id)) return null; + try { + Field f = NetworkRegistry.class.getDeclaredField("PAYLOAD_REGISTRATIONS"); + f.setAccessible(true); + @SuppressWarnings("unchecked") + var regs = (Map>) f.get(null); + var playMap = regs.get(ConnectionProtocol.PLAY); + return playMap != null ? playMap.get(id) : null; + } catch (Exception e) { + return null; + } + } + + @Inject( + method = "onConfigurationFinished", + at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableSet$Builder;build()Lcom/google/common/collect/ImmutableSet;", ordinal = 1), + locals = LocalCapture.CAPTURE_FAILHARD, + remap = false + ) + private static void hexcasting$addPlayChannels( + ICommonPacketListener listener, + CallbackInfo ci, + NetworkPayloadSetup setup, + ImmutableSet.Builder notListeningAnymoreOn, + ImmutableSet.Builder nowListeningOn + ) { + nowListeningOn.addAll(HEX_PLAY_PAYLOAD_IDS); + } + + @ModifyVariable( + method = "getCodec", + ordinal = 0, + at = @At("STORE"), + remap = false + ) + private static Object hexcasting$fallbackPlayCodec( + Object registration, + ResourceLocation id, + ConnectionProtocol protocol, + PacketFlow flow + ) { + if (registration != null) return registration; + if (!MOD_ID.equals(id.getNamespace())) return null; + try { + Field f = NetworkRegistry.class.getDeclaredField("PAYLOAD_REGISTRATIONS"); + f.setAccessible(true); + @SuppressWarnings("unchecked") + Map> regs = + (Map>) f.get(null); + Map playMap = regs.get(ConnectionProtocol.PLAY); + if (playMap == null) return null; + PayloadRegistration playReg = playMap.get(id); + if (playReg == null) return null; + if (playReg.flow().isPresent() && playReg.flow().get() != flow) return null; + return playReg; + } catch (Exception e) { + return null; + } + } +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinTagsProvider.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinTagsProvider.java index e815506337..d8720a71a2 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinTagsProvider.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/ForgeMixinTagsProvider.java @@ -1,8 +1,8 @@ package at.petrak.hexcasting.forge.mixin; -import at.petrak.hexcasting.forge.datagen.TagsProviderEFHSetter; +import at.petrak.hexcasting.forge.mixin.TagsProviderEFHSetter; import net.minecraft.data.tags.TagsProvider; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -25,7 +25,7 @@ public void setEFH(ExistingFileHelper efh) { @Redirect(method = "missing(Lnet/minecraft/tags/TagEntry;)Z", at = @At( value = "FIELD", - target = "Lnet/minecraft/data/tags/TagsProvider;existingFileHelper:Lnet/minecraftforge/common/data/ExistingFileHelper;", + target = "Lnet/minecraft/data/tags/TagsProvider;existingFileHelper:Lnet/neoforged/neoforge/common/data/ExistingFileHelper;", opcode = Opcodes.GETFIELD), remap = false) private ExistingFileHelper hex$missingRedirect(TagsProvider instance) { @@ -34,14 +34,7 @@ public void setEFH(ExistingFileHelper efh) { return actualFileHelper; } - @Redirect(method = "lambda$getOrCreateRawBuilder$9(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/tags/TagBuilder;", at = @At( - value = "FIELD", - target = "Lnet/minecraft/data/tags/TagsProvider;existingFileHelper:Lnet/minecraftforge/common/data/ExistingFileHelper;", - opcode = Opcodes.GETFIELD), - remap = false) - private ExistingFileHelper hex$getOrCreateRawBuilderRedirect(TagsProvider instance) { - if (actualFileHelper == null) - return existingFileHelper; - return actualFileHelper; - } + // 1.21: lambda$getOrCreateRawBuilder$9 no longer exists - method renamed to getOrCreateTagBuilder. + // Only redirect in missing() - tag()/getOrCreateTagBuilder path may need additional redirect + // if addOptionalTag validation fails. Try lambda$getOrCreateTagBuilder$0 if datagen breaks. } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/TagsProviderEFHSetter.java b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/TagsProviderEFHSetter.java new file mode 100644 index 0000000000..4df9d4f4d5 --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/mixin/TagsProviderEFHSetter.java @@ -0,0 +1,11 @@ +package at.petrak.hexcasting.forge.mixin; + +import net.neoforged.neoforge.common.data.ExistingFileHelper; + +/** + * Interface for injecting ExistingFileHelper into TagsProvider subclasses that don't receive it + * via constructor (e.g. Paucal-based providers). Used by ForgeMixinTagsProvider. + */ +public interface TagsProviderEFHSetter { + void setEFH(ExistingFileHelper efh); +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java b/Forge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java index abf74064e8..5ea823572b 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java @@ -1,80 +1,50 @@ package at.petrak.hexcasting.forge.network; import at.petrak.hexcasting.common.msgs.*; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; -import org.apache.logging.log4j.util.TriConsumer; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import static at.petrak.hexcasting.api.HexAPI.modLoc; +import static at.petrak.hexcasting.api.HexAPI.MOD_ID; +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD, modid = MOD_ID) public class ForgePacketHandler { - private static final String PROTOCOL_VERSION = "1"; - private static final SimpleChannel NETWORK = NetworkRegistry.newSimpleChannel( - modLoc("main"), - () -> PROTOCOL_VERSION, - PROTOCOL_VERSION::equals, - PROTOCOL_VERSION::equals - ); - - public static SimpleChannel getNetwork() { - return NETWORK; - } - public static void init() { - int messageIdx = 0; + @SubscribeEvent + public static void registerPayloads(RegisterPayloadHandlersEvent event) { + final var registrar = event.registrar("1"); // Client -> server - NETWORK.registerMessage(messageIdx++, MsgNewSpellPatternC2S.class, MsgNewSpellPatternC2S::serialize, - MsgNewSpellPatternC2S::deserialize, makeServerBoundHandler(MsgNewSpellPatternC2S::handle)); - NETWORK.registerMessage(messageIdx++, MsgShiftScrollC2S.class, MsgShiftScrollC2S::serialize, - MsgShiftScrollC2S::deserialize, makeServerBoundHandler(MsgShiftScrollC2S::handle)); - - // Server -> client - NETWORK.registerMessage(messageIdx++, MsgNewSpellPatternS2C.class, MsgNewSpellPatternS2C::serialize, - MsgNewSpellPatternS2C::deserialize, makeClientBoundHandler(MsgNewSpellPatternS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgSentinelStatusUpdateAck.class, MsgSentinelStatusUpdateAck::serialize, - MsgSentinelStatusUpdateAck::deserialize, makeClientBoundHandler(MsgSentinelStatusUpdateAck::handle)); - NETWORK.registerMessage(messageIdx++, MsgPigmentUpdateAck.class, MsgPigmentUpdateAck::serialize, - MsgPigmentUpdateAck::deserialize, makeClientBoundHandler(MsgPigmentUpdateAck::handle)); - NETWORK.registerMessage(messageIdx++, MsgAltioraUpdateAck.class, MsgAltioraUpdateAck::serialize, - MsgAltioraUpdateAck::deserialize, makeClientBoundHandler(MsgAltioraUpdateAck::handle)); - NETWORK.registerMessage(messageIdx++, MsgCastParticleS2C.class, MsgCastParticleS2C::serialize, - MsgCastParticleS2C::deserialize, makeClientBoundHandler(MsgCastParticleS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgOpenSpellGuiS2C.class, MsgOpenSpellGuiS2C::serialize, - MsgOpenSpellGuiS2C::deserialize, makeClientBoundHandler(MsgOpenSpellGuiS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgBeepS2C.class, MsgBeepS2C::serialize, - MsgBeepS2C::deserialize, makeClientBoundHandler(MsgBeepS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgBrainsweepAck.class, MsgBrainsweepAck::serialize, - MsgBrainsweepAck::deserialize, makeClientBoundHandler(MsgBrainsweepAck::handle)); - NETWORK.registerMessage(messageIdx++, MsgNewWallScrollS2C.class, MsgNewWallScrollS2C::serialize, - MsgNewWallScrollS2C::deserialize, makeClientBoundHandler(MsgNewWallScrollS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgRecalcWallScrollDisplayS2C.class, MsgRecalcWallScrollDisplayS2C::serialize, - MsgRecalcWallScrollDisplayS2C::deserialize, makeClientBoundHandler(MsgRecalcWallScrollDisplayS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgNewSpiralPatternsS2C.class, MsgNewSpiralPatternsS2C::serialize, - MsgNewSpiralPatternsS2C::deserialize, makeClientBoundHandler(MsgNewSpiralPatternsS2C::handle)); - NETWORK.registerMessage(messageIdx++, MsgClearSpiralPatternsS2C.class, MsgClearSpiralPatternsS2C::serialize, - MsgClearSpiralPatternsS2C::deserialize, makeClientBoundHandler(MsgClearSpiralPatternsS2C::handle)); - } - - private static BiConsumer> makeServerBoundHandler( - TriConsumer handler) { - return (m, ctx) -> { - handler.accept(m, ctx.get().getSender().getServer(), ctx.get().getSender()); - ctx.get().setPacketHandled(true); - }; - } - - private static BiConsumer> makeClientBoundHandler(Consumer consumer) { - return (m, ctx) -> { - consumer.accept(m); - ctx.get().setPacketHandled(true); - }; + registrar.playToServer( + MsgNewSpellPatternC2S.TYPE, + MsgNewSpellPatternC2S.STREAM_CODEC, + (payload, context) -> payload.handle( + context.player().getServer(), + (net.minecraft.server.level.ServerPlayer) context.player() + ) + ); + registrar.playToServer( + MsgShiftScrollC2S.TYPE, + MsgShiftScrollC2S.STREAM_CODEC, + (payload, context) -> payload.handle( + context.player().getServer(), + (net.minecraft.server.level.ServerPlayer) context.player() + ) + ); + + // Server -> client: playToClient with mixin bypass for checkPacket (commonToClient registers + // for CONFIGURATION phase only, causing encoder ClassCastException during PLAY). + registrar.playToClient(MsgNewSpellPatternS2C.TYPE, MsgNewSpellPatternS2C.STREAM_CODEC, (payload, ctx) -> MsgNewSpellPatternS2C.handle(payload)); + registrar.playToClient(MsgSentinelStatusUpdateAck.TYPE, MsgSentinelStatusUpdateAck.STREAM_CODEC, (payload, ctx) -> MsgSentinelStatusUpdateAck.handle(payload)); + registrar.playToClient(MsgPigmentUpdateAck.TYPE, MsgPigmentUpdateAck.STREAM_CODEC, (payload, ctx) -> MsgPigmentUpdateAck.handle(payload)); + registrar.playToClient(MsgAltioraUpdateAck.TYPE, MsgAltioraUpdateAck.STREAM_CODEC, (payload, ctx) -> MsgAltioraUpdateAck.handle(payload)); + registrar.playToClient(MsgCastParticleS2C.TYPE, MsgCastParticleS2C.STREAM_CODEC, (payload, ctx) -> MsgCastParticleS2C.handle(payload)); + registrar.playToClient(MsgOpenSpellGuiS2C.TYPE, MsgOpenSpellGuiS2C.STREAM_CODEC, (payload, ctx) -> MsgOpenSpellGuiS2C.handle(payload)); + registrar.playToClient(MsgBeepS2C.TYPE, MsgBeepS2C.STREAM_CODEC, (payload, ctx) -> MsgBeepS2C.handle(payload)); + registrar.playToClient(MsgBrainsweepAck.TYPE, MsgBrainsweepAck.STREAM_CODEC, (payload, ctx) -> MsgBrainsweepAck.handle(payload)); + registrar.playToClient(MsgNewWallScrollS2C.TYPE, MsgNewWallScrollS2C.STREAM_CODEC, (payload, ctx) -> MsgNewWallScrollS2C.handle(payload)); + registrar.playToClient(MsgRecalcWallScrollDisplayS2C.TYPE, MsgRecalcWallScrollDisplayS2C.STREAM_CODEC, (payload, ctx) -> MsgRecalcWallScrollDisplayS2C.handle(payload)); + registrar.playToClient(MsgNewSpiralPatternsS2C.TYPE, MsgNewSpiralPatternsS2C.STREAM_CODEC, (payload, ctx) -> MsgNewSpiralPatternsS2C.handle(payload)); + registrar.playToClient(MsgClearSpiralPatternsS2C.TYPE, MsgClearSpiralPatternsS2C.STREAM_CODEC, (payload, ctx) -> MsgClearSpiralPatternsS2C.handle(payload)); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgAltioraUpdateAck.java b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgAltioraUpdateAck.java index 0e932b55ea..eae3a946ef 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgAltioraUpdateAck.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgAltioraUpdateAck.java @@ -3,9 +3,11 @@ import at.petrak.hexcasting.api.player.AltioraAbility; import at.petrak.hexcasting.common.msgs.IMessage; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; @@ -13,14 +15,21 @@ public record MsgAltioraUpdateAck(@Nullable AltioraAbility altiora) implements IMessage { public static final ResourceLocation ID = modLoc("altiora"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgAltioraUpdateAck::serialize, MsgAltioraUpdateAck::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgAltioraUpdateAck deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgAltioraUpdateAck deserialize(FriendlyByteBuf buf) { var extant = buf.readBoolean(); if (!extant) { diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgBrainsweepAck.java b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgBrainsweepAck.java index c9d24606fc..39928cf6e4 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgBrainsweepAck.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgBrainsweepAck.java @@ -2,9 +2,11 @@ import at.petrak.hexcasting.common.msgs.IMessage; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Mob; @@ -16,14 +18,21 @@ */ public record MsgBrainsweepAck(int target) implements IMessage { public static final ResourceLocation ID = modLoc("sweep"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgBrainsweepAck::serialize, MsgBrainsweepAck::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgBrainsweepAck deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgBrainsweepAck deserialize(FriendlyByteBuf buf) { var target = buf.readInt(); return new MsgBrainsweepAck(target); diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgPigmentUpdateAck.java b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgPigmentUpdateAck.java index c38266b1ae..a7fc178c84 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgPigmentUpdateAck.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgPigmentUpdateAck.java @@ -3,9 +3,11 @@ import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.common.msgs.IMessage; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import static at.petrak.hexcasting.api.HexAPI.modLoc; @@ -15,17 +17,23 @@ */ public record MsgPigmentUpdateAck(FrozenPigment update) implements IMessage { public static final ResourceLocation ID = modLoc("color"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgPigmentUpdateAck::serialize, MsgPigmentUpdateAck::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgPigmentUpdateAck deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); - - var tag = buf.readAnySizeNbt(); - var colorizer = FrozenPigment.fromNBT(tag); + public static MsgPigmentUpdateAck deserialize(FriendlyByteBuf buf) { + var tag = buf.readNbt(); + var colorizer = FrozenPigment.fromNBT(tag != null ? tag : new net.minecraft.nbt.CompoundTag()); return new MsgPigmentUpdateAck(colorizer); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgSentinelStatusUpdateAck.java b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgSentinelStatusUpdateAck.java index dc8f712d8e..9886bca904 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgSentinelStatusUpdateAck.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/network/MsgSentinelStatusUpdateAck.java @@ -3,10 +3,12 @@ import at.petrak.hexcasting.api.player.Sentinel; import at.petrak.hexcasting.common.msgs.IMessage; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; @@ -20,14 +22,21 @@ */ public record MsgSentinelStatusUpdateAck(@Nullable Sentinel update) implements IMessage { public static final ResourceLocation ID = modLoc("sntnl"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec STREAM_CODEC = + StreamCodec.ofMember(MsgSentinelStatusUpdateAck::serialize, MsgSentinelStatusUpdateAck::deserialize); + + @Override + public CustomPacketPayload.Type type() { + return TYPE; + } @Override public ResourceLocation getFabricId() { return ID; } - public static MsgSentinelStatusUpdateAck deserialize(ByteBuf buffer) { - var buf = new FriendlyByteBuf(buffer); + public static MsgSentinelStatusUpdateAck deserialize(FriendlyByteBuf buf) { var exists = buf.readBoolean(); if (!exists) { diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeModConditionalIngredient.java b/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeModConditionalIngredient.java index 0969291d47..ce7e3f37a6 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeModConditionalIngredient.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeModConditionalIngredient.java @@ -1,44 +1,49 @@ package at.petrak.hexcasting.forge.recipe; +import at.petrak.hexcasting.forge.lib.ForgeHexIngredientTypes; import at.petrak.hexcasting.xplat.IXplatAbstractions; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Decoder; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.Encoder; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.common.crafting.AbstractIngredient; -import net.minecraftforge.common.crafting.IIngredientSerializer; +import net.neoforged.neoforge.common.crafting.ICustomIngredient; +import net.neoforged.neoforge.common.crafting.IngredientType; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.Arrays; -import java.util.Objects; +import java.util.stream.Stream; import static at.petrak.hexcasting.api.HexAPI.modLoc; -public class ForgeModConditionalIngredient extends AbstractIngredient { +public class ForgeModConditionalIngredient implements ICustomIngredient { public static final ResourceLocation ID = modLoc("mod_conditional"); private final Ingredient main; private final String modid; private final Ingredient ifModLoaded; - private final Ingredient toUse; protected ForgeModConditionalIngredient(Ingredient main, String modid, Ingredient ifModLoaded) { - super(IXplatAbstractions.INSTANCE.isModPresent(modid) ? Arrays.stream(ifModLoaded.values) : Arrays.stream(main.values)); this.main = main; this.modid = modid; this.ifModLoaded = ifModLoaded; - this.toUse = IXplatAbstractions.INSTANCE.isModPresent(modid) ? ifModLoaded : main; } - /** - * Creates a new ingredient matching the given stack - */ public static ForgeModConditionalIngredient of(Ingredient main, String modid, Ingredient ifModLoaded) { return new ForgeModConditionalIngredient(main, modid, ifModLoaded); } @@ -54,61 +59,63 @@ public boolean isSimple() { } @Override - public @NotNull JsonElement toJson() { - JsonObject json = new JsonObject(); - json.addProperty("type", Objects.toString(ID)); - json.add("default", main.toJson()); - json.addProperty("modid", modid); - json.add("if_loaded", ifModLoaded.toJson()); - return json; + public @NotNull Stream getItems() { + return Arrays.stream(toUse.getItems()); } @Override - public @NotNull IIngredientSerializer getSerializer() { - return Serializer.INSTANCE; - } - - public static @NotNull Ingredient fromNetwork(FriendlyByteBuf friendlyByteBuf) { - return Ingredient.fromNetwork(friendlyByteBuf); // Just send the actual ingredient + public @NotNull IngredientType getType() { + return ForgeHexIngredientTypes.MOD_CONDITIONAL.get(); } - public static Ingredient fromJson(JsonObject object) { - if (object.has("type") && object.getAsJsonPrimitive("type").getAsString().equals(ID.toString())) { - if (object.has("modid") && IXplatAbstractions.INSTANCE.isModPresent(object.getAsJsonPrimitive("modid").getAsString())) { - try { - Ingredient ingredient = Ingredient.fromJson(object.get("if_loaded")); - if (!ingredient.isEmpty()) { - return ingredient; + private static final Codec INGREDIENT_CODEC = Codec.of( + new Encoder<>() { + @Override + public DataResult encode(Ingredient input, DynamicOps ops, T prefix) { + var custom = input.getCustomIngredient(); + JsonElement json; + if (custom != null) { + @SuppressWarnings("unchecked") + var codec = (com.mojang.serialization.Codec) custom.getType().codec().codec(); + var result = codec.encodeStart(JsonOps.INSTANCE, custom); + if (result.result().isPresent()) { + json = result.result().get(); + } else { + return DataResult.error(() -> "Failed to encode custom ingredient: " + result.error().get().message()); } - } catch (JsonParseException e) { - // NO-OP + } else { + json = serializeVanillaIngredient(input); } + return DataResult.success(new Dynamic<>(JsonOps.INSTANCE, json).convert(ops).getValue()); + } + }, + new Decoder<>() { + @Override + public DataResult> decode(DynamicOps ops, T input) { + return Ingredient.CODEC.parse(ops, input).map(ingr -> com.mojang.datafixers.util.Pair.of(ingr, input)); } - - return Ingredient.fromJson(object.get("default")); } + ); - return Ingredient.of(); - } - - public static class Serializer implements IIngredientSerializer { - public static final Serializer INSTANCE = new Serializer(); - - @Override - public @NotNull Ingredient parse(@NotNull FriendlyByteBuf buffer) { - return fromNetwork(buffer); + private static JsonElement serializeVanillaIngredient(Ingredient input) { + var items = Arrays.asList(input.getItems()); + if (items.isEmpty()) { + return new JsonObject(); } + var first = items.get(0); + JsonObject obj = new JsonObject(); + obj.addProperty("item", BuiltInRegistries.ITEM.getKey(first.getItem()).toString()); + return obj; + } - @Override - public @NotNull Ingredient parse(@NotNull JsonObject json) { - return fromJson(json); - } + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> + inst.group( + INGREDIENT_CODEC.fieldOf("default").forGetter(f -> f.main), + Codec.STRING.fieldOf("modid").forGetter(f -> f.modid), + INGREDIENT_CODEC.fieldOf("if_loaded").forGetter(f -> f.ifModLoaded) + ).apply(inst, ForgeModConditionalIngredient::new) + ); - @Override - public void write(@NotNull FriendlyByteBuf buffer, @NotNull Ingredient ingredient) { - if (ingredient instanceof ForgeModConditionalIngredient conditionalIngredient) - conditionalIngredient.toUse.toNetwork(buffer); - // It shouldn't be possible to not be a ForgeModConditionalIngredient here - } - } + public static final net.minecraft.network.codec.StreamCodec STREAM_CODEC = + ByteBufCodecs.fromCodecWithRegistries(CODEC.codec()); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java b/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java index 434104aa9b..a60f023607 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java @@ -4,27 +4,26 @@ import at.petrak.hexcasting.api.casting.iota.NullIota; import at.petrak.hexcasting.api.item.IotaHolderItem; import at.petrak.hexcasting.api.utils.NBTHelper; +import at.petrak.hexcasting.forge.lib.ForgeHexIngredientTypes; import at.petrak.hexcasting.xplat.IXplatAbstractions; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.common.crafting.AbstractIngredient; -import net.minecraftforge.common.crafting.CraftingHelper; -import net.minecraftforge.common.crafting.IIngredientSerializer; -import net.minecraftforge.common.crafting.PartialNBTIngredient; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.crafting.ICustomIngredient; +import net.neoforged.neoforge.common.crafting.IngredientType; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.Objects; import java.util.stream.Stream; import static at.petrak.hexcasting.api.HexAPI.modLoc; -public class ForgeUnsealedIngredient extends AbstractIngredient { +public class ForgeUnsealedIngredient implements ICustomIngredient { public static final ResourceLocation ID = modLoc("unsealed"); private final ItemStack stack; @@ -36,7 +35,6 @@ private static ItemStack createStack(ItemStack base) { } protected ForgeUnsealedIngredient(ItemStack stack) { - super(Stream.of(new Ingredient.ItemValue(createStack(stack)))); this.stack = stack; } @@ -47,6 +45,10 @@ public static ForgeUnsealedIngredient of(ItemStack stack) { return new ForgeUnsealedIngredient(stack); } + public ItemStack getStack() { + return stack; + } + @Override public boolean test(@Nullable ItemStack input) { if (input == null) { @@ -58,7 +60,6 @@ public boolean test(@Nullable ItemStack input) { return holder.readIotaTag() != null && holder.writeIota(new NullIota(), true); } } - return false; } @@ -68,36 +69,24 @@ public boolean isSimple() { } @Override - public @NotNull IIngredientSerializer getSerializer() { - return ForgeUnsealedIngredient.Serializer.INSTANCE; + public @NotNull Stream getItems() { + return Stream.of(createStack(stack)); } @Override - public @NotNull JsonElement toJson() { - JsonObject json = new JsonObject(); - // TODO: should this be Partial or Strict - json.addProperty("type", Objects.toString(CraftingHelper.getID(PartialNBTIngredient.Serializer.INSTANCE))); - json.addProperty("item", Objects.toString(ForgeRegistries.ITEMS.getKey(stack.getItem()))); - return json; + public @NotNull IngredientType getType() { + return ForgeHexIngredientTypes.UNSEALED.get(); } - - public static class Serializer implements IIngredientSerializer { - public static final ForgeUnsealedIngredient.Serializer INSTANCE = new ForgeUnsealedIngredient.Serializer(); - - @Override - public @NotNull ForgeUnsealedIngredient parse(FriendlyByteBuf buffer) { - return new ForgeUnsealedIngredient(buffer.readItem()); - } - - @Override - public @NotNull ForgeUnsealedIngredient parse(@NotNull JsonObject json) { - return new ForgeUnsealedIngredient(CraftingHelper.getItemStack(json, true)); - } - - @Override - public void write(FriendlyByteBuf buffer, ForgeUnsealedIngredient ingredient) { - buffer.writeItem(ingredient.stack); - } - } + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> + inst.group( + ResourceLocation.CODEC.xmap( + rl -> new ItemStack(BuiltInRegistries.ITEM.get(rl)), + s -> BuiltInRegistries.ITEM.getKey(s.getItem()) + ).fieldOf("item").forGetter(ForgeUnsealedIngredient::getStack) + ).apply(inst, ForgeUnsealedIngredient::new) + ); + + public static final net.minecraft.network.codec.StreamCodec STREAM_CODEC = + ByteBufCodecs.fromCodecWithRegistries(CODEC.codec()); } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeClientXplatImpl.java b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeClientXplatImpl.java index d33c2654b0..dcd272f8be 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeClientXplatImpl.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeClientXplatImpl.java @@ -3,8 +3,9 @@ import at.petrak.hexcasting.api.client.ClientCastingStack; import at.petrak.hexcasting.common.msgs.IMessage; import at.petrak.hexcasting.forge.cap.HexCapabilities; -import at.petrak.hexcasting.forge.network.ForgePacketHandler; import at.petrak.hexcasting.xplat.IClientXplatAbstractions; +import net.minecraft.client.Minecraft; +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.EntityRenderers; @@ -22,7 +23,10 @@ public class ForgeClientXplatImpl implements IClientXplatAbstractions { @Override public void sendPacketToServer(IMessage packet) { - ForgePacketHandler.getNetwork().sendToServer(packet); + var connection = Minecraft.getInstance().getConnection(); + if (connection != null) { + connection.send(new ServerboundCustomPayloadPacket(packet)); + } } @Override @@ -49,10 +53,10 @@ public void registerItemProperty(Item item, ResourceLocation id, ItemPropertyFun @Override public ClientCastingStack getClientCastingStack(Player player) { - var maybeCap = player.getCapability(HexCapabilities.CLIENT_CASTING_STACK).resolve(); - if (maybeCap.isEmpty()) + var cap = player.getCapability(HexCapabilities.CLIENT_CASTING_STACK); + if (cap == null) return new ClientCastingStack(); // lie - return maybeCap.get().get(); + return cap.get(); } @Override diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeOptionalMods.java b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeOptionalMods.java new file mode 100644 index 0000000000..d74dfa3d4d --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeOptionalMods.java @@ -0,0 +1,80 @@ +package at.petrak.hexcasting.forge.xplat; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.player.Player; + +import java.lang.reflect.Method; + +/** + * Reflection-based access to optional mods (Caelus, Pehkui) to avoid compile-time dependency + * when libs are not present. + */ +public final class ForgeOptionalMods { + + // Caelus: flight attribute for elytra + private static Class caelusApiClass; + private static Method caelusGetInstance; + private static Method caelusGetFlightAttribute; + + static { + try { + caelusApiClass = Class.forName("top.theillusivec4.caelus.api.CaelusApi"); + caelusGetInstance = caelusApiClass.getMethod("getInstance"); + caelusGetFlightAttribute = caelusApiClass.getMethod("getFlightAttribute"); + } catch (Exception ignored) { + } + } + + public static Attribute getCaelusFlightAttribute() { + if (caelusApiClass == null) return null; + try { + var instance = caelusGetInstance.invoke(null); + return (Attribute) caelusGetFlightAttribute.invoke(instance); + } catch (Exception e) { + return null; + } + } + + // Pehkui: scale get/set + private static Class scaleTypesClass; + private static Method getScaleData; + private static Method getScale; + private static Method setScale; + + static { + try { + scaleTypesClass = Class.forName("virtuoel.pehkui.api.ScaleTypes"); + var baseField = scaleTypesClass.getField("BASE"); + var base = baseField.get(null); + getScaleData = base.getClass().getMethod("getScaleData", Entity.class); + var scaleDataType = getScaleData.getReturnType(); + getScale = scaleDataType.getMethod("getScale"); + setScale = scaleDataType.getMethod("setScale", float.class); + } catch (Exception ignored) { + } + } + + public static float getPehkuiScale(Entity entity) { + if (scaleTypesClass == null) return 1f; + try { + var baseField = scaleTypesClass.getField("BASE"); + var base = baseField.get(null); + var scaleData = getScaleData.invoke(base, entity); + return (Float) getScale.invoke(scaleData); + } catch (Exception e) { + return 1f; + } + } + + public static void setPehkuiScale(Entity entity, float scale) { + if (scaleTypesClass == null) return; + try { + var baseField = scaleTypesClass.getField("BASE"); + var base = baseField.get(null); + var scaleData = getScaleData.invoke(base, entity); + setScale.invoke(scaleData, scale); + } catch (Exception ignored) { + } + } +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java index d39a71e857..cf5e5f2485 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java @@ -14,6 +14,7 @@ import at.petrak.hexcasting.api.casting.eval.vm.CastingVM; import at.petrak.hexcasting.api.casting.eval.vm.ContinuationFrame; import at.petrak.hexcasting.api.casting.iota.IotaType; +import at.petrak.hexcasting.api.mod.HexConfig; import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.api.pigment.ColorProvider; import at.petrak.hexcasting.api.pigment.FrozenPigment; @@ -30,7 +31,6 @@ import at.petrak.hexcasting.forge.cap.HexCapabilities; import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop; import at.petrak.hexcasting.forge.mixin.ForgeAccessorBuiltInRegistries; -import at.petrak.hexcasting.forge.network.ForgePacketHandler; import at.petrak.hexcasting.forge.network.MsgBrainsweepAck; import at.petrak.hexcasting.forge.recipe.ForgeUnsealedIngredient; import at.petrak.hexcasting.interop.HexInterop; @@ -57,10 +57,13 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.Mob; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; @@ -72,33 +75,32 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.*; -import net.minecraftforge.common.loot.CanToolPerformAction; -import net.minecraftforge.common.util.FakePlayerFactory; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidType; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.loot.CanItemPerformAbility; +import net.neoforged.neoforge.common.util.FakePlayerFactory; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.FluidType; +import net.neoforged.neoforge.fluids.FluidUtil; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.FMLEnvironment; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; +import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.Nullable; -import top.theillusivec4.caelus.api.CaelusApi; -import virtuoel.pehkui.api.ScaleTypes; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.UUID; +import java.util.stream.Stream; import java.util.function.BiFunction; import java.util.function.Supplier; import static at.petrak.hexcasting.api.HexAPI.modLoc; -import static net.minecraftforge.fluids.capability.IFluidHandler.FluidAction.EXECUTE; +import static net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction.EXECUTE; public class ForgeXplatImpl implements IXplatAbstractions { @Override @@ -108,7 +110,7 @@ public Platform platform() { @Override public boolean isPhysicalClient() { - return FMLLoader.getDist() == Dist.CLIENT; + return FMLEnvironment.dist == Dist.CLIENT; } @Override @@ -133,8 +135,7 @@ public void setBrainsweepAddlData(Mob mob) { mob.getPersistentData().putBoolean(TAG_BRAINSWEPT, true); if (mob.level() instanceof ServerLevel) { - ForgePacketHandler.getNetwork() - .send(PacketDistributor.TRACKING_ENTITY.with(() -> mob), MsgBrainsweepAck.of(mob)); + PacketDistributor.sendToPlayersTrackingEntity(mob, MsgBrainsweepAck.of(mob)); } } @@ -165,16 +166,23 @@ public void setAltiora(Player player, @Nullable AltioraAbility altiora) { tag.remove(TAG_ALTIORA_ALLOWED); } - // The elytra ability is done with an event on fabric - var elytraing = CaelusApi.getInstance().getFlightAttribute(); - var inst = player.getAttributes().getInstance(elytraing); - if (altiora != null) { - if (inst.getModifier(ALTIORA_ATTRIBUTE_ID) == null) { - inst.addTransientModifier(new AttributeModifier(ALTIORA_ATTRIBUTE_ID, "Altiora", 1.0, - AttributeModifier.Operation.ADDITION)); + // The elytra ability is done with an event on fabric (Caelus provides flight attribute) + var elytraing = ForgeOptionalMods.getCaelusFlightAttribute(); + if (elytraing != null) { + var holder = BuiltInRegistries.ATTRIBUTE.getResourceKey(elytraing) + .map(k -> BuiltInRegistries.ATTRIBUTE.getHolderOrThrow(k)) + .orElse(null); + if (holder != null) { + var inst = player.getAttributes().getInstance(holder); + if (altiora != null) { + if (inst.getModifier(ALTIORA_ATTRIBUTE_ID) == null) { + inst.addTransientModifier(new AttributeModifier(ALTIORA_ATTRIBUTE_ID, 1.0, + AttributeModifier.Operation.ADD_VALUE)); + } + } else { + inst.removeModifier(ALTIORA_ATTRIBUTE_ID); + } } - } else { - inst.removeModifier(ALTIORA_ATTRIBUTE_ID); } if (player instanceof ServerPlayer serverPlayer) { @@ -246,7 +254,7 @@ public FlightAbility getFlight(ServerPlayer player) { var origin = HexUtils.vecFromNBT(tag.getCompound(TAG_FLIGHT_ORIGIN)); var radius = tag.getDouble(TAG_FLIGHT_RADIUS); var dimension = ResourceKey.create(Registries.DIMENSION, - new ResourceLocation(tag.getString(TAG_FLIGHT_DIMENSION))); + ResourceLocation.parse(tag.getString(TAG_FLIGHT_DIMENSION))); return new FlightAbility(timeLeft, dimension, origin, radius); } return null; @@ -278,14 +286,13 @@ public Sentinel getSentinel(Player player) { var extendsRange = tag.getBoolean(TAG_SENTINEL_GREATER); var position = HexUtils.vecFromNBT(tag.getCompound(TAG_SENTINEL_POSITION)); var dimension = ResourceKey.create(Registries.DIMENSION, - new ResourceLocation(tag.getString(TAG_SENTINEL_DIMENSION))); + ResourceLocation.parse(tag.getString(TAG_SENTINEL_DIMENSION))); return new Sentinel(extendsRange, position, dimension); } @Override public CastingVM getStaffcastVM(ServerPlayer player, InteractionHand hand) { - // This is always from a staff because we don't need to load the VM when casting from item var ctx = new StaffCastEnv(player, hand); return new CastingVM(CastingImage.loadFromNbt(player.getPersistentData().getCompound(TAG_VM), player.serverLevel()), ctx); @@ -312,77 +319,71 @@ public void clearCastingData(ServerPlayer player) { @Override public @Nullable ADMediaHolder findMediaHolder(ItemStack stack) { - var maybeCap = stack.getCapability(HexCapabilities.MEDIA).resolve(); - return maybeCap.orElse(null); + return stack.getCapability(HexCapabilities.MEDIA); } @Override public @Nullable ADMediaHolder findMediaHolder(ServerPlayer player) { - var maybeCap = player.getCapability(HexCapabilities.MEDIA).resolve(); - return maybeCap.orElse(null); + // Media is only on item stacks; player aggregates from inventory via MediaHelper.scanPlayerForMediaStuff + return null; } @Override public @Nullable ADIotaHolder findDataHolder(ItemStack stack) { - var maybeCap = stack.getCapability(HexCapabilities.IOTA).resolve(); - return maybeCap.orElse(null); + return stack.getCapability(HexCapabilities.IOTA); } @Override public @Nullable ADIotaHolder findDataHolder(Entity entity) { - var maybeCap = entity.getCapability(HexCapabilities.IOTA).resolve(); - return maybeCap.orElse(null); + return entity.getCapability(HexCapabilities.IOTA_ENTITY); } @Override public @Nullable ADHexHolder findHexHolder(ItemStack stack) { - var maybeCap = stack.getCapability(HexCapabilities.STORED_HEX).resolve(); - return maybeCap.orElse(null); + return stack.getCapability(HexCapabilities.STORED_HEX); } @Override public @Nullable ADVariantItem findVariantHolder(ItemStack stack) { - var maybeCap = stack.getCapability(HexCapabilities.VARIANT_ITEM).resolve(); - return maybeCap.orElse(null); + return stack.getCapability(HexCapabilities.VARIANT_ITEM); } @Override public boolean isPigment(ItemStack stack) { - return stack.getCapability(HexCapabilities.COLOR).isPresent(); + return stack.getCapability(HexCapabilities.COLOR) != null; } @Override public ColorProvider getColorProvider(FrozenPigment pigment) { - var maybePigment = pigment.item().getCapability(HexCapabilities.COLOR).resolve(); - if (maybePigment.isPresent()) { - return maybePigment.get().provideColor(pigment.owner()); + var cap = pigment.item().getCapability(HexCapabilities.COLOR); + if (cap != null) { + return cap.provideColor(pigment.owner()); } return ColorProvider.MISSING; } @Override public void sendPacketToPlayer(ServerPlayer target, IMessage packet) { - ForgePacketHandler.getNetwork().send(PacketDistributor.PLAYER.with(() -> target), packet); + PacketDistributor.sendToPlayer(target, packet); } @Override public void sendPacketNear(Vec3 pos, double radius, ServerLevel dimension, IMessage packet) { - ForgePacketHandler.getNetwork().send(PacketDistributor.NEAR.with(() -> new PacketDistributor.TargetPoint( - pos.x, pos.y, pos.z, radius * radius, dimension.dimension() - )), packet); + PacketDistributor.sendToPlayersNear(dimension, null, pos.x, pos.y, pos.z, radius, packet); } @Override public void sendPacketTracking(Entity entity, IMessage packet) { - ForgePacketHandler.getNetwork().send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), packet); + PacketDistributor.sendToPlayersTrackingEntity(entity, packet); } @Override public Packet toVanillaClientboundPacket(IMessage message) { - //noinspection unchecked - return (Packet) ForgePacketHandler.getNetwork().toVanillaPacket(message, NetworkDirection.PLAY_TO_CLIENT); + // ClientboundCustomPayloadPacket implements Packet + // which extends ClientGamePacketListener for play phase + return (Packet) (Object) new ClientboundCustomPayloadPacket(message); } @Override @@ -393,17 +394,17 @@ public BlockEntityType createBlockEntityType(BiFuncti @Override public boolean tryPlaceFluid(Level level, InteractionHand hand, BlockPos pos, Fluid fluid) { - Optional handler = FluidUtil.getFluidHandler(level, pos, Direction.UP).resolve(); - return handler.isPresent() && - handler.get().fill(new FluidStack(fluid, FluidType.BUCKET_VOLUME), EXECUTE) > 0; + var handler = FluidUtil.getFluidHandler(level, pos, Direction.UP).orElse(null); + return handler != null && + handler.fill(new FluidStack(fluid, FluidType.BUCKET_VOLUME), EXECUTE) > 0; } @Override public boolean drainAllFluid(Level level, BlockPos pos) { - Optional handler = FluidUtil.getFluidHandler(level, pos, Direction.UP).resolve(); - if (handler.isPresent()) { + var handler = FluidUtil.getFluidHandler(level, pos, Direction.UP).orElse(null); + if (handler != null) { boolean any = false; - IFluidHandler pool = handler.get(); + IFluidHandler pool = handler; for (int i = 0; i < pool.getTanks(); i++) { if (!pool.drain(pool.getFluidInTank(i), EXECUTE).isEmpty()) { any = true; @@ -416,12 +417,31 @@ public boolean drainAllFluid(Level level, BlockPos pos) { @Override public Ingredient getUnsealedIngredient(ItemStack stack) { - return ForgeUnsealedIngredient.of(stack); + return ForgeUnsealedIngredient.of(stack).toVanilla(); + } + + private static List harvestStacks(Item... items) { + return Stream.of(items).map(ItemStack::new).toList(); } + private static final List> HARVEST_TOOLS_BY_LEVEL = List.of( + harvestStacks(Items.WOODEN_PICKAXE, Items.WOODEN_AXE, Items.WOODEN_HOE, Items.WOODEN_SHOVEL), + harvestStacks(Items.STONE_PICKAXE, Items.STONE_AXE, Items.STONE_HOE, Items.STONE_SHOVEL), + harvestStacks(Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_HOE, Items.IRON_SHOVEL), + harvestStacks(Items.DIAMOND_PICKAXE, Items.DIAMOND_AXE, Items.DIAMOND_HOE, Items.DIAMOND_SHOVEL), + harvestStacks(Items.NETHERITE_PICKAXE, Items.NETHERITE_AXE, Items.NETHERITE_HOE, Items.NETHERITE_SHOVEL) + ); + @Override public boolean isCorrectTierForDrops(Tier tier, BlockState bs) { - return !bs.requiresCorrectToolForDrops() || TierSortingRegistry.isCorrectTierForDrops(tier, bs); + if (!bs.requiresCorrectToolForDrops()) return true; + // TierSortingRegistry removed in NeoForge 21.1; use tool check like Fabric + int level = HexConfig.server().opBreakHarvestLevelBecauseForgeThoughtItWasAGoodIdeaToImplementHarvestTiersUsingAnHonestToGodTopoSort(); + int idx = Math.min(Math.max(level, 0), HARVEST_TOOLS_BY_LEVEL.size() - 1); + for (var tool : HARVEST_TOOLS_BY_LEVEL.get(idx)) { + if (tool.isCorrectToolForDrops(bs)) return true; + } + return false; } @Override @@ -432,12 +452,12 @@ public Item.Properties addEquipSlotFabric(EquipmentSlot slot) { private static final IXplatTags TAGS = new IXplatTags() { @Override public TagKey amethystDust() { - return HexTags.Items.create(new ResourceLocation("forge", "dusts/amethyst")); + return HexTags.Items.create(ResourceLocation.fromNamespaceAndPath("forge", "dusts/amethyst")); } @Override public TagKey gems() { - return HexTags.Items.create(new ResourceLocation("forge", "gems")); + return HexTags.Items.create(ResourceLocation.fromNamespaceAndPath("forge", "gems")); } }; @@ -448,7 +468,7 @@ public IXplatTags tags() { @Override public LootItemCondition.Builder isShearsCondition() { - return CanToolPerformAction.canToolPerformAction(ToolActions.SHEARS_DIG); + return CanItemPerformAbility.canItemPerformAbility(ItemAbilities.SHEARS_DIG); } @Override @@ -526,7 +546,9 @@ public Registry getEvalSoundRegistry() { public boolean isBreakingAllowed(ServerLevel world, BlockPos pos, BlockState state, @Nullable Player player) { if (player == null) player = FakePlayerFactory.get(world, HEXCASTING); - return !MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, state, player)); + var evt = new BlockEvent.BreakEvent(world, pos, state, player); + NeoForge.EVENT_BUS.post(evt); + return !evt.isCanceled(); } @Override @@ -535,8 +557,10 @@ public boolean isPlacingAllowed(ServerLevel world, BlockPos pos, ItemStack block player = FakePlayerFactory.get(world, HEXCASTING); ItemStack cached = player.getMainHandItem(); player.setItemInHand(InteractionHand.MAIN_HAND, blockStack.copy()); - var evt = ForgeHooks.onRightClickBlock(player, InteractionHand.MAIN_HAND, pos, - new BlockHitResult(Vec3.atCenterOf(pos), Direction.DOWN, pos, true)); + var hitVec = new BlockHitResult(Vec3.atCenterOf(pos), Direction.DOWN, pos, true); + var evt = new net.neoforged.neoforge.event.entity.player.PlayerInteractEvent.RightClickBlock( + player, InteractionHand.MAIN_HAND, pos, hitVec); + NeoForge.EVENT_BUS.post(evt); player.setItemInHand(InteractionHand.MAIN_HAND, cached); return !evt.isCanceled(); } @@ -554,12 +578,12 @@ public PehkuiInterop.ApiAbstraction getPehkuiApi() { PEHKUI_API = new PehkuiInterop.ApiAbstraction() { @Override public float getScale(Entity e) { - return ScaleTypes.BASE.getScaleData(e).getScale(); + return ForgeOptionalMods.getPehkuiScale(e); } @Override public void setScale(Entity e, float scale) { - ScaleTypes.BASE.getScaleData(e).setScale(scale); + ForgeOptionalMods.setPehkuiScale(e, scale); } }; } @@ -583,7 +607,8 @@ public void setScale(Entity e, float scale) { public static final String TAG_ALTIORA_ALLOWED = "hexcasting:altiora_allowed"; public static final String TAG_ALTIORA_GRACE = "hexcasting:altiora_grace_period"; - public static final UUID ALTIORA_ATTRIBUTE_ID = UUID.fromString("91897c79-3ebb-468c-a265-40418ed01c41"); + public static final net.minecraft.resources.ResourceLocation ALTIORA_ATTRIBUTE_ID = + modLoc("altiora"); public static final String TAG_VM = "hexcasting:spell_harness"; public static final String TAG_PATTERNS = "hexcasting:spell_patterns"; diff --git a/Forge/src/main/resources/META-INF/neoforge.mods.toml b/Forge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000000..511439bf2e --- /dev/null +++ b/Forge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,63 @@ +modLoader = "kotlinforforge" +loaderVersion = "[5,)" +license = "MIT" + +issueTrackerURL = "https://github.com/gamma-delta/HexMod/issues" + +[[mods]] +modId = "hexcasting" +version = "${file.jarVersion}" +displayName = "Hex Casting" +displayURL = "https://github.com/gamma-delta/HexMod" +logoFile = "logo.png" +credits = "Falkory for textures; Wiresegal for lots of polish; Alwinfy for visual effects, proofreading, and code help; Kra3tor for sound effects; naj77 for the nice logo; and all of my wonderful patrons for supporting me!" +authors = "petrak@ (aka gamma-delta)" +description = "Cast powerful Hexes on the fly by drawing patterns with a staff." + +[[dependencies.hexcasting]] +modId = "neoforge" +mandatory = true +versionRange = "[21,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.hexcasting]] +modId = "minecraft" +mandatory = true +versionRange = "[1.21.1,1.22)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.hexcasting]] +modId = "paucal" +mandatory = true +versionRange = "[0.7.0,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.hexcasting]] +modId = "patchouli" +mandatory = true +versionRange = "[1.21.1-92,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.hexcasting]] +modId = "caelus" +mandatory = true +versionRange = "[7.0.1,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.hexcasting]] +modId = "curios" +type = "optional" +versionRange = "[9.4.0,)" +ordering = "NONE" +side = "BOTH" + +[[mixins]] +config = "hexcasting_forge.mixins.json" + +[[mixins]] +config = "hexplat.mixins.json" diff --git a/Forge/src/main/resources/hexcasting_forge.mixins.json b/Forge/src/main/resources/hexcasting_forge.mixins.json index 3a50c75493..57daae6590 100644 --- a/Forge/src/main/resources/hexcasting_forge.mixins.json +++ b/Forge/src/main/resources/hexcasting_forge.mixins.json @@ -7,10 +7,9 @@ "mixins": [ "ForgeAccessorBuiltInRegistries", "ForgeMixinCursedRecipeSerializerBase", + "ForgeMixinCustomPacketPayload", + "ForgeMixinNetworkRegistry", "ForgeMixinTagsProvider" ], - "client": [ - "ForgeMixinBlockColors", - "ForgeMixinItemColors" - ] + "client": [] } diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index a2da4ee85f..0000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env groovy - -pipeline { - agent any - tools { - jdk "jdk-17.0.1" - } - environment { - discordWebhook = credentials('discordWebhook') - CURSEFORGE_TOKEN = credentials('curseforgeApiKey') - MODRINTH_TOKEN = credentials('modrinthApiKey') - } - stages { - stage('Clean') { - steps { - echo 'Cleaning Project' - sh 'chmod +x gradlew' - sh './gradlew clean' - } - } - stage('Build') { - steps { - echo 'Building' - sh './gradlew build' - } - } - stage('Run Datagen') { - steps { - echo 'Running datagen tasks' - sh './gradlew runAllDatagen' - } - } - stage('Check Datagen') { - steps { - echo 'Checking for modified files' - // also fail if there are new untracked files - sh 'git add --intent-to-add .' - // cache isn't reproducible, so ignore modifications to it - // https://stackoverflow.com/a/71878316 - sh 'git diff --name-only --exit-code -- ":!:*/src/generated/resources/.cache/*"' - } - } - stage('Publish') { - when { - allOf { - branch 'main' - not { changeRequest() } - } - } - stages { - stage('Deploy Previews') { - steps { - echo 'Deploying previews to various places' - sh './gradlew publish publishToDiscord' - } - } - stage('Deploy releases') { - steps { - echo 'Maybe deploy releases' - sh './gradlew publishCurseforge publishModrinth' - } - } - } - } - } - post { - always { - archiveArtifacts 'Common/build/libs/**.jar' - archiveArtifacts 'Forge/build/libs/**.jar' - archiveArtifacts 'Fabric/build/libs/**.jar' - } - } -} \ No newline at end of file diff --git a/Paucal b/Paucal new file mode 160000 index 0000000000..9d8060ab09 --- /dev/null +++ b/Paucal @@ -0,0 +1 @@ +Subproject commit 9d8060ab09dfe91dfde063968474824ac63c114b diff --git a/build.gradle b/build.gradle index 957b112bed..57b2f03a68 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ pkpcpbp { doProjectMetadata = false setupJarMetadata = true setupMavenMetadata = true - javaVersion = 17 + javaVersion = 21 modInfo { modID = project.modID mcVersion = project.minecraftVersion @@ -83,30 +83,28 @@ subprojects { tasks.withType(JavaCompile).configureEach { it.options.encoding = 'UTF-8' - it.options.release = 17 + it.options.release = 21 } compileKotlin { kotlinOptions { - jvmTarget = "17" + jvmTarget = "21" } } compileTestKotlin { kotlinOptions { - jvmTarget = "17" + jvmTarget = "21" } } - // Disables Gradle's custom module metadata from being published to maven. The - // metadata includes mapped dependencies which are not reasonably consumable by - // other mod developers. + // Disable custom module metadata (mapped deps not consumable by others) tasks.withType(GenerateModuleMetadata) { enabled = false } sourceSets.main.kotlin.srcDirs += 'src/main/java' - java.toolchain.languageVersion = JavaLanguageVersion.of(17) + java.toolchain.languageVersion = JavaLanguageVersion.of(21) java.withSourcesJar() java.withJavadocJar() @@ -132,5 +130,5 @@ allprojects { tasks.register("runAllDatagen") { dependsOn ":Forge:runXplatDatagen" dependsOn ":Forge:runForgeDatagen" - dependsOn ":Fabric:runDatagen" + // dependsOn ":Fabric:runDatagen" // Re-enable when Fabric is included } diff --git a/compile-mixins.txt b/compile-mixins.txt new file mode 100644 index 0000000000..d57d8fed6d --- /dev/null +++ b/compile-mixins.txt @@ -0,0 +1,306 @@ +To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.8/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. +Daemon will be stopped at the end of the build + +> Configure project :Paucal +Architect Plugin: 3.4.162 +Architectury Loom: 1.7.435 +You are using an outdated version of Architectury Loom! This version will not receive any support, please consider updating! + +> Configure project :Common +SpongePowered Vanilla 'GRADLE' Toolset Version '0.2.1-SNAPSHOT' +Targeting Minecraft '1.21.1' on a 'JOINED' platform + +> Task :Common:checkKotlinGradlePluginConfigurationErrors SKIPPED +> Task :Common:compileKotlin UP-TO-DATE +> Task :Common:compileJava UP-TO-DATE +> Task :Common:processResources UP-TO-DATE +> Task :Common:classes +> Task :Common:jar +> Task :Forge:checkKotlinGradlePluginConfigurationErrors SKIPPED +> Task :Forge:createMinecraftArtifacts UP-TO-DATE +> Task :Forge:compileKotlin + +> Task :Forge:compileJava +.\gradlew : Note: SpongePowered MIXIN Annotation Processor Version=0.8.5 +At C:\Users\KMService\AppData\Local\Temp\ps-script-a610a53e-070e-45c8-b000-e99144863737.ps1:105 char:69 ++ ... ing 1.21.1 neoforge draft"; .\gradlew :Forge:compileJava 2>&1 | Out-F ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (Note: SpongePow...r Version=0.8.5:String) [], RemoteException + + FullyQualifiedErrorId : NativeCommandError + +Note: Supported obfuscation types: ObfuscationServiceMCP supports [searge,notch] +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\mixin\ForgeMixinBlockColors.java:12: warning: Unable to determine +descriptor for @Inject target method + @Inject(method = "create", at = @At("RETURN")) + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\mixin\ForgeMixinItemColors.java:13: warning: Unable to determine +descriptor for @Inject target method + @Inject(method = "create", at = @At("RETURN")) + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:24: error: package +at.petrak.hexcasting.forge.datagen does not exist +import at.petrak.hexcasting.forge.datagen.ForgeHexDataGenerators; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:55: error: cannot find symbol +import net.neoforged.fml.DistExecutor; + ^ + symbol: class DistExecutor + location: package net.neoforged.fml +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:58: error: cannot find symbol +import net.neoforged.neoforge.common.ToolActions; + ^ + symbol: class ToolActions + location: package net.neoforged.neoforge.common +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:63: error: cannot find symbol +import net.neoforged.neoforge.event.TickEvent; + ^ + symbol: class TickEvent + location: package net.neoforged.neoforge.event +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:71: error: package +net.neoforged.neoforge.eventbus.api does not exist +import net.neoforged.neoforge.eventbus.api.IEventBus; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:79: error: cannot find symbol + private static IEventBus MOD_BUS; + ^ + symbol: class IEventBus + location: class ForgeHexInitializer +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:81: error: cannot find symbol + public ForgeHexInitializer(IEventBus modBus) { + ^ + symbol: class IEventBus + location: class ForgeHexInitializer +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\ForgeHexInitializer.java:165: error: cannot find symbol + private static void initListeners(IEventBus modBus) { + ^ + symbol: class IEventBus + location: class ForgeHexInitializer +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\recipe\ForgeModConditionalIngredient.java:11: error: cannot find +symbol +import net.neoforged.neoforge.common.crafting.AbstractIngredient; + ^ + symbol: class AbstractIngredient + location: package net.neoforged.neoforge.common.crafting +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\recipe\ForgeModConditionalIngredient.java:12: error: cannot find +symbol +import net.neoforged.neoforge.common.crafting.IIngredientSerializer; + ^ + symbol: class IIngredientSerializer + location: package net.neoforged.neoforge.common.crafting +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\recipe\ForgeModConditionalIngredient.java:21: error: cannot find +symbol +public class ForgeModConditionalIngredient extends AbstractIngredient { + ^ + symbol: class AbstractIngredient +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\recipe\ForgeModConditionalIngredient.java:67: error: cannot find +symbol + public @NotNull IIngredientSerializer getSerializer() { + ^ + symbol: class IIngredientSerializer + location: class ForgeModConditionalIngredient +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\mixin\ForgeMixinTagsProvider.java:3: error: package +at.petrak.hexcasting.forge.datagen does not exist +import at.petrak.hexcasting.forge.datagen.TagsProviderEFHSetter; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\mixin\ForgeMixinTagsProvider.java:14: error: cannot find symbol +public abstract class ForgeMixinTagsProvider implements TagsProviderEFHSetter { + ^ + symbol: class TagsProviderEFHSetter +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\recipe\ForgeModConditionalIngredient.java:94: error: cannot find +symbol + public static class Serializer implements IIngredientSerializer { + ^ + symbol: class IIngredientSerializer + location: class ForgeModConditionalIngredient +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\xplat\ForgeXplatImpl.java:76: error: cannot find symbol +import net.neoforged.neoforge.common.ToolActions; + ^ + symbol: class ToolActions + location: package net.neoforged.neoforge.common +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\xplat\ForgeXplatImpl.java:77: error: cannot find symbol +import net.neoforged.neoforge.common.TierSortingRegistry; + ^ + symbol: class TierSortingRegistry + location: package net.neoforged.neoforge.common +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Forge\src\main\java\at\petrak\hexcasting\forge\xplat\ForgeXplatImpl.java:78: error: cannot find symbol +import net.neoforged.neoforge.common.loot.CanToolPerformAction; + ^ + symbol: class CanToolPerformAction + location: package net.neoforged.neoforge.common.loot +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\api\casting\iota\EntityIota.java:5: error: package +com.samsthenerd.inline.api does not exist +import com.samsthenerd.inline.api.InlineAPI; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\api\casting\iota\EntityIota.java:6: error: package +com.samsthenerd.inline.api.data does not exist +import com.samsthenerd.inline.api.data.EntityInlineData; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\api\casting\iota\EntityIota.java:7: error: package +com.samsthenerd.inline.api.data does not exist +import com.samsthenerd.inline.api.data.PlayerHeadData; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:6: error: package +com.samsthenerd.inline.api does not exist +import com.samsthenerd.inline.api.InlineAPI; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:7: error: package +com.samsthenerd.inline.api.matching does not exist +import com.samsthenerd.inline.api.matching.InlineMatch; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:8: error: package +com.samsthenerd.inline.api.matching does not exist +import com.samsthenerd.inline.api.matching.MatchContext; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:9: error: package +com.samsthenerd.inline.api.matching does not exist +import com.samsthenerd.inline.api.matching.MatcherInfo; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:10: error: package +com.samsthenerd.inline.api.matching does not exist +import com.samsthenerd.inline.api.matching.RegexMatcher; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:23: error: cannot find symbol +public class HexPatternMatcher implements RegexMatcher { + ^ + symbol: class RegexMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:26: error: cannot find symbol + private static final MatcherInfo patternMatcherInfo = MatcherInfo.fromId(patternMatcherID); + ^ + symbol: class MatcherInfo + location: class HexPatternMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:39: error: cannot find symbol + public Tuple getMatchAndGroup(MatchResult regexMatch, MatchContext ctx) { + ^ + symbol: class MatchContext + location: class HexPatternMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:39: error: cannot find symbol + public Tuple getMatchAndGroup(MatchResult regexMatch, MatchContext ctx) { + ^ + symbol: class InlineMatch + location: class HexPatternMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:72: error: cannot find symbol + public InlineMatch getMatch(MatchResult mr, MatchContext ctx){ + ^ + symbol: class MatchContext + location: class HexPatternMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:72: error: cannot find symbol + public InlineMatch getMatch(MatchResult mr, MatchContext ctx){ + ^ + symbol: class InlineMatch + location: class HexPatternMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\HexPatternMatcher.java:76: error: cannot find symbol + public MatcherInfo getInfo(){ + ^ + symbol: class MatcherInfo + location: class HexPatternMatcher +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlineHex.java:3: error: package +com.samsthenerd.inline.api does not exist +import com.samsthenerd.inline.api.InlineAPI; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlineHexClient.java:3: error: package +com.samsthenerd.inline.api.client does not exist +import com.samsthenerd.inline.api.client.InlineClientAPI; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternData.java:10: error: package +com.samsthenerd.inline.api does not exist +import com.samsthenerd.inline.api.InlineData; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternData.java:21: error: cannot find symbol +public class InlinePatternData implements InlineData{ + ^ + symbol: class InlineData +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternData.java:73: error: cannot find symbol + public static class InlinePatternDataType implements InlineDataType { + ^ + symbol: class InlineDataType + location: class InlinePatternData +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternRenderer.java:4: error: package +com.samsthenerd.inline.api.client does not exist +import com.samsthenerd.inline.api.client.GlowHandling; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternRenderer.java:5: error: package +com.samsthenerd.inline.api.client does not exist +import com.samsthenerd.inline.api.client.InlineRenderer; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternRenderer.java:6: error: package +com.samsthenerd.inline.impl does not exist +import com.samsthenerd.inline.impl.InlineStyle; + ^ +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternRenderer.java:11: error: cannot find symbol +public class InlinePatternRenderer implements InlineRenderer { + ^ + symbol: class InlineRenderer +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternRenderer.java:51: error: cannot find symbol + public GlowHandling getGlowPreference(InlinePatternData forData) { + ^ + symbol: class GlowHandling + location: class InlinePatternRenderer +C:\Users\KMService\Documents\hexcasting 1.21.1 neoforge +draft\Common\src\main\java\at\petrak\hexcasting\interop\inline\InlinePatternRenderer.java:57: error: cannot find symbol + public int render(InlinePatternData data, GuiGraphics drawContext, int index, Style style, int codepoint, +TextRenderingContext trContext){ + ^ + symbol: class TextRenderingContext + location: class InlinePatternRenderer +44 errors +2 warnings + +> Task :Forge:compileJava FAILED + +FAILURE: Build failed with an exception. + +* What went wrong: +Execution failed for task ':Forge:compileJava'. +> Compilation failed; see the compiler error output for details. + +* Try: +> Run with --info option to get more log output. +> Run with --scan to get full insights. + +BUILD FAILED in 17s +8 actionable tasks: 4 executed, 4 up-to-date diff --git a/compile-output.txt b/compile-output.txt new file mode 100644 index 0000000000000000000000000000000000000000..7445fb0f1fd13c300ea4632bd95fd362c1e70364 GIT binary patch literal 5232 zcmds*X>S`<6o&6-B>uw`q&h5iv$Q2OQl&O=iqmExO$rD@<#>x5r?xzHLImQc1MhQ= zFEisfAyGddkTsr}d(Xb#`SXv%FbqjJ(f@m0(=gWCMDHElx5JyTqkF2iiGF>-^z@d5 zu3#f%-&T%=+Yf`#)^5{q9C{$!vi6{ngiY;r!kKYP!bmiRp{147Xj~YDf#8k}+PR$S zxg9E6-I{R)e{2v)?eZeUmwFyahK{&6KcKq0TvpcnSiJ@dj+cUcB`Joo26!vN`O0wD!Xv}`L3>l}G-vYRMYla`#18utX^kD-Cg-}3 z4bG#>t#MWEc?s@`+M#JihRjpRJVBme8!Sfb_YKzNL8DX>;UQvtvLL2g+IesC5rsrH z@UDUDcF%Obo1gIJnSRg)^R-DpzIWuqVYo0}ZlO13JF}(I(%Z5Ph~|PuPuI?HcWp`F+*? zSB$&+%_Z9w#k%O%Bps4bAMmx;ma~GT;FyL}K~*ifqdlq?v2Z;NFQwN+G>|BtnfVx= z&x|ZbYm%FqM|>sH_oZap*AMBUzpj^}ST7G`nN+lhL$9GpI1;V0EV!rtP1*ENlo!$U zN{Vg&J>7~jkPV)LSA9(G5d&R8P*Z#V~48Lffn9MSO8W&?dQ4Ds3 z>9LGA6O*NFa*!R3LL4_liCAgK22G3LMtC>Vp`knQbcTuHpI#$FV`fFK70^nhITG*K z(}vlW+@*%}jn+VM34Lnp*s9lSX|W+)BLAxLcg?Ce5S}B{bZmQfy7W+@B-UEGE>^@p z-kGTW^g8+}d6dBpXSI7Q8dO*+^E@`)m)<=z8WVLQ?6wp>6Eu|pztd~zwr8e0wF4aN za48E7b#I$?&$N2mIC&;MBSj0gY|7$vKkuy#R6olBs#CxmVCgha2dYU6O&*jYfbb$+v}2? z&Wm2y!RMk_e?4C_Xy?KINHl$>ZVA_?D(nZfyH}1S)#@WzepA>!D_ly)@!zYS;p7<| zBu?SfkGi<|Nv3I2OA>yySj&4Y2|wG~&A$0Rc73QMxh0I{yuFtAro+p`IoRSjx zjnmqRu*%_k%U({NoM?-bJ^Qn-1MJhMke3rS*_!8dd;O-;pFZO=xSv8?XLdMM)7h{9 zeV8s!{qS?rRlax8aS>;qx7@Px`mIWeEM8O78NE3%Uq9IwEuQtVE%~W#rz$@mKq;;r z>C9ELIC-u(z{dEM8QJ55x6E^X+VzPtU#s0Z(EVKS-&rpw$~f=gWuBV19-I41+nls^Lwk<0!$WZUq#9(F_Ccwn{0k+J(TrmMM7y0)G zm&bi^Jr5>2_hXT2R}#@*y-x6jqbEOdPRhLd+`8H;>uWKBICVM>^Vt)@qw_